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.txten la ruta URL con /home/www/static/robots.txty 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.txtlo tanto, se sirve /home/www/static/robots.txtporque /robots.txtdespojado del /robots.txtprefijo es la cadena vacía, y agregar la cadena vacía para /home/www/static/robots.txtdejarla sin cambios. Pero, /robots.txt1sería servido desde /home/www/static/robots.txt1y /robots.txt/foobarserí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.txtno 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.txtque 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_filesdirectiva cambia el comportamiento de root/ alias, y existen restricciones sobre dónde aliasse puede usar.
=en ambos casos, ¿correcto? ¿O solo se aplica aroot? Además, vea mi edición: no quise usar ambos a la vez. :)