Я думаю, що варто чітко викласти, що 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
? Також дивіться мою редагування - я не хотів використовувати обидва відразу. :)