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