Je pense que cela vaut la peine de préciser explicitement que nginx fonctionne sur des préfixes et non sur des fichiers en tant que tels. Dans le premier cas,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx remplace le préfixe de chaîne /robots.txt
dans le chemin de l'URL par /home/www/static/robots.txt
, puis utilise le résultat comme chemin du système de fichiers. Représenté sous forme de pseudocode, ce serait quelque chose comme:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Donc /robots.txt
est servi depuis /home/www/static/robots.txt
parce que /robots.txt
le /robots.txt
préfixe dépouillé est la chaîne vide, et en ajoutant la chaîne vide pour la /home/www/static/robots.txt
laisser inchangée. Mais, /robots.txt1
serait servi de /home/www/static/robots.txt1
et /robots.txt/foobar
serait servi de /home/www/static/robots.txt/foobar
. Ces fichiers peuvent ne pas exister, ce qui entraîne l'envoi d'une réponse 404 par nginx. Il est probable que ce robots.txt
n'est pas un répertoire de toute façon, mais nginx ne le sait pas à l'avance. Tout cela est basé sur les préfixes de chaîne et non sur ce qui semble être un fichier. ou répertoire par l’absence ou la présence d’une barre oblique.
Considérant que, dans le second cas,
location /robots.txt { root /home/www/static/; }
nginx insère la chaîne /home/www/static/
au début du chemin d'URL, puis utilise le résultat comme chemin du système de fichiers. En pseudo-code, cela ressemblerait à quelque chose comme:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Cela a exactement le même résultat que dans le premier cas, mais pour une raison différente. Il n'y a pas d'élimination de préfixe, mais comme chaque chemin d'URI doit contenir le préfixe /robots.txt
, les chemins du système de fichiers commencent toujours par /home/www/static//robots.txt
ce qui est équivalent à /home/www/static/robots.txt
.
Bien sûr, le pseudocode ne dit pas tout, par exemple nginx n'utilisera pas aveuglément les chemins d'URL bruts /../../../etc/passwd
, la try_files
directive modifie le comportement de root
/ alias
et il existe des contraintes sur le alias
lieu d'utilisation.
=
dans les deux cas, correct? Ou est-ce seulement applicable àroot
? Aussi, voir mon édition - je ne voulais pas utiliser les deux à la fois. :)