Я думаю, что стоит явно указать, что nginx работает с префиксами, а не с файлами как таковыми. В первом случае
location /robots.txt { alias /home/www/static/robots.txt; }
nginx заменяет префикс строки /robots.txt
в пути URL-адреса /home/www/static/robots.txt
и затем использует результат в качестве пути файловой системы. Представленный как псевдокод, это будет что-то вроде:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Так /robots.txt
подается из-за того, /home/www/static/robots.txt
что /robots.txt
лишенный /robots.txt
префикса является пустой строкой, а добавление пустой строки /home/www/static/robots.txt
оставляет ее без изменений. Но, /robots.txt1
будет подан от /home/www/static/robots.txt1
и /robots.txt/foobar
будет подан от /home/www/static/robots.txt/foobar
. Эти файлы могут не существовать, что приводит к тому, что nginx отправляет ответ 404, и, вероятно, robots.txt
в любом случае это не каталог, но nginx заранее об этом не знает, и все это основано на строковых префиксах, а не на том, что кажется файлом или каталог по отсутствию или наличию косой черты.
Тогда как во втором случае
location /robots.txt { root /home/www/static/; }
nginx вставляет строку /home/www/static/
в начало пути URL, а затем использует результат в качестве пути файловой системы. В псевдокоде это будет что-то вроде:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Это имеет тот же результат, что и в первом случае, но по другой причине. Прерывание префикса отсутствует, но поскольку каждый путь URI должен содержать префикс /robots.txt
, пути к файловой системе всегда начинаются с того, /home/www/static//robots.txt
что эквивалентно /home/www/static/robots.txt
.
Конечно, псевдокод не совсем рассказывает всю историю, так как, например, nginx не будет слепо использовать необработанные URL-пути, как /../../../etc/passwd
, например , try_files
директива изменяет поведение root
/ alias
, и существуют ограничения на то, где alias
можно использовать.
=
в обоих случаях, правильно? Или это относится только кroot
? Кроме того, посмотрите мое редактирование - я не хотел использовать оба сразу. :)