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.txtdans 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.txtest servi depuis /home/www/static/robots.txtparce que /robots.txtle /robots.txtpréfixe dépouillé est la chaîne vide, et en ajoutant la chaîne vide pour la /home/www/static/robots.txtlaisser inchangée. Mais, /robots.txt1serait servi de /home/www/static/robots.txt1et /robots.txt/foobarserait 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.txtn'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.txtce 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_filesdirective modifie le comportement de root/ aliaset il existe des contraintes sur le aliaslieu 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. :)