Creo que vale la pena exponer explícitamente que nginx funciona con prefijos y no con archivos en sí. En el primer caso,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx reemplaza el prefijo de cadena /robots.txt
en la ruta URL con /home/www/static/robots.txt
y luego usa el resultado como una ruta del sistema de archivos. Representado como pseudocódigo, esto sería algo así como:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Por /robots.txt
lo tanto, se sirve /home/www/static/robots.txt
porque /robots.txt
despojado del /robots.txt
prefijo es la cadena vacía, y agregar la cadena vacía para /home/www/static/robots.txt
dejarla sin cambios. Pero, /robots.txt1
sería servido desde /home/www/static/robots.txt1
y /robots.txt/foobar
sería servido desde /home/www/static/robots.txt/foobar
. Es posible que esos archivos no existan, lo que hace que nginx envíe una respuesta 404, y es probable que robots.txt
no sea un directorio de todos modos, pero nginx no lo sabe de antemano, y todo esto se basa en prefijos de cadena y no en lo que parece ser un archivo o directorio por la ausencia o presencia de una barra inclinada final.
Considerando que, en el segundo caso,
location /robots.txt { root /home/www/static/; }
nginx inserta la cadena /home/www/static/
al comienzo de la ruta URL y luego usa el resultado como una ruta del sistema de archivos. En pseudocódigo, esto sería algo como:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Esto tiene exactamente el mismo resultado que el primer caso, pero por una razón diferente. No hay eliminación de prefijos, pero dado que cada ruta URI debe contener el prefijo /robots.txt
, las rutas del sistema de archivos siempre comenzarán con lo /home/www/static//robots.txt
que es equivalente a /home/www/static/robots.txt
.
Por supuesto, el pseudocódigo no cuenta toda la historia, ya que, por ejemplo, nginx no usará ciegamente rutas de URL sin formato como /../../../etc/passwd
, la try_files
directiva cambia el comportamiento de root
/ alias
, y existen restricciones sobre dónde alias
se puede usar.
=
en ambos casos, ¿correcto? ¿O solo se aplica aroot
? Además, vea mi edición: no quise usar ambos a la vez. :)