Je pense qu'il vaut la peine de préciser explicitement que nginx fonctionne sur des préfixes et non pas des fichiers en soi. Dans le premier cas,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx remplace la chaîne préfixe /robots.txt
dans le chemin URL par /home/www/static/robots.txt
puis utilise le résultat comme un chemin de système de fichiers. Représenté en pseudocode, cela ressemblerait à quelque chose comme :
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Ainsi, /robots.txt
est servi depuis /home/www/static/robots.txt
car /robots.txt
dépouillé du préfixe /robots.txt
est une chaîne vide, et l'ajout de la chaîne vide à /home/www/static/robots.txt
ne le modifie pas. Cependant, /robots.txt1
serait servi depuis /home/www/static/robots.txt1
et /robots.txt/foobar
serait servi depuis /home/www/static/robots.txt/foobar
. Ces fichiers peuvent ne pas exister, ce qui amène nginx à renvoyer une réponse 404, et il est probable que robots.txt
n'est de toute façon pas un répertoire, mais nginx ne le sait pas à l'avance, et tout cela repose sur des préfixes de chaînes et non pas sur ce qui semble être un fichier ou un répertoire par l'absence ou la présence d'un slash final.
Alors que, dans le deuxième cas,
location /robots.txt { root /home/www/static/; }
nginx insère la chaîne /home/www/static/
au début du chemin URL puis utilise le résultat comme un chemin de système de fichiers. En pseudocode, cela ressemblerait à quelque chose comme :
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath
serveFile(fsPath)
}
Cela a exactement le même résultat que le premier cas, mais pour une raison différente. Il n'y a pas de dépouillage de préfixe, mais puisque chaque chemin d'URI doit contenir le préfixe /robots.txt
, alors les chemins du système de fichiers commenceront toujours par /home/www/static//robots.txt
ce qui est équivalent à /home/www/static/robots.txt
.
Bien sûr, le pseudocode ne raconte pas tout l'histoire, car par exemple nginx n'utilisera pas aveuglément des chemins d'URL bruts comme /../../../etc/passwd
, la directive try_files
modifie le comportement de root
/alias
, et il y a des contraintes sur l'endroit où alias
peut être utilisé.