Après avoir passé de nombreuses heures nginx
à servir des fichiers uniques tels que robots.txt
(conseil: effacez le cache de votre navigateur à chaque fois), je me suis retrouvé de deux manières différentes, l'une utilisant la directive alias et l'autre à l'aide de la directive racine , comme suit:
location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/; }
Y a-t-il une différence fonctionnelle entre les deux? Ou des problèmes de sécurité? Des conflits avec d'autres directives? (Les deux semblaient bien avec un autre emplacement / statique). Ou une raison de choisir l'un sur l'autre?
Note - Je n'ai pas utilisé les deux en même temps :) J'ai plutôt essayé les uns après les autres, et les deux ont fonctionné. Je ne demande pas comment ils interagissent ensemble dans le même fichier, mais lequel serait-il préférable d'utiliser.
=
dans les deux cas, correct? Ou est-ce seulement applicable àroot
? Aussi, voir mon édition - je ne voulais pas utiliser les deux à la fois. :)=
dans les deux cas.Oui, il y a une différence: avec "alias" vous pouvez .. ainsi alias pour un autre nom de fichier, comme
tandis que
vous oblige à nommer votre fichier sur le serveur également robots.txt. J'utilise la première option car j'aime nommer mes fichiers robots sur mon serveur comme étant tld.domain.subdomain-robots.txt; par exemple
la source
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,
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: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 cerobots.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,
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: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
, latry_files
directive modifie le comportement deroot
/alias
et il existe des contraintes sur lealias
lieu d'utilisation.la source
Il y a une différence lorsque l'alias est destiné à un répertoire entier.
va travailler, tandis que
ne fera pas. Cela devrait être
(Facile à confondre)
la source