Myślę, że warto wyraźnie określić, że nginx działa na prefiksach, a nie na plikach jako takich. W pierwszym przypadku,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx zastępuje przedrostek łańcucha /robots.txt
w ścieżce adresu URL, /home/www/static/robots.txt
a następnie wykorzystuje wynik jako ścieżkę systemu plików. Reprezentowany jako pseudokod, mógłby wyglądać mniej więcej tak:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
/robots.txt
Jest więc obsługiwany, /home/www/static/robots.txt
ponieważ /robots.txt
pozbawiony /robots.txt
prefiksu jest pusty ciąg, a dodanie pustego ciągu powoduje /home/www/static/robots.txt
pozostawienie go bez zmian. Ale /robots.txt1
będą podawane z /home/www/static/robots.txt1
i /robots.txt/foobar
będą podawane z /home/www/static/robots.txt/foobar
. Te pliki mogą nie istnieć, co powoduje, że nginx wysyła odpowiedź 404, i prawdopodobnie robots.txt
nie jest to katalog, ale nginx nie wie o tym z góry, a wszystko to opiera się na prefiksach ciągów, a nie na tym, co wydaje się być plikiem lub katalog przez brak lub obecność końcowego ukośnika.
Podczas gdy w drugim przypadku
location /robots.txt { root /home/www/static/; }
nginx wstawia ciąg /home/www/static/
na początku ścieżki URL, a następnie wykorzystuje wynik jako ścieżkę do systemu plików. W pseudokodzie byłoby to coś takiego:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Ma to dokładnie taki sam wynik jak pierwszy przypadek, ale z innego powodu. Nie ma możliwości usuwania prefiksu, ale ponieważ każda ścieżka URI musi zawierać prefiks /robots.txt
, ścieżki systemu plików zawsze zaczynają się od tego, /home/www/static//robots.txt
co jest równoważne /home/www/static/robots.txt
.
Oczywiście pseudokod nie do końca opowiada całą historię, ponieważ np. Nginx nie będzie ślepo używać surowych ścieżek URL, np /../../../etc/passwd
. try_files
Dyrektywa zmienia zachowanie root
/ alias
i istnieją ograniczenia dotyczące tego, gdzie alias
można go użyć.
=
w obu przypadkach, prawda? Czy dotyczy to tylkoroot
? Zobacz też moją edycję - nie chciałem używać obu naraz. :)