Bence açıkça nginx'in dosya başına değil önek üzerinde çalıştığını ortaya koymaya değer. İlk durumda,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx URL yolundaki dize önekini /robots.txt
ile değiştirir /home/www/static/robots.txt
ve sonucu bir dosya sistemi yolu olarak kullanır. Sahte kod olarak gösterilen, bu gibi bir şey olurdu:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Yani /robots.txt
servis edilir /home/www/static/robots.txt
çünkü /robots.txt
elimden /robots.txt
önek boş dize ve boş dize ekleyerek /home/www/static/robots.txt
değişmeden bırakır. Ancak, /robots.txt1
o hizmet /home/www/static/robots.txt1
ve /robots.txt/foobar
olacaktır /home/www/static/robots.txt/foobar
. Bu dosyalar mevcut olmayabilir ve nginx'in 404 yanıt göndermesine neden olabilir ve muhtemelen bu robots.txt
bir dizin değildir, ancak nginx bunu önceden bilmez ve bunların tümü dizenin öneklerine dayanır ve dosya göründüğü gibi değildir. ya da sondaki eğik çizginin yokluğu ya da varlığı ile dizin.
Oysa ikinci durumda,
location /robots.txt { root /home/www/static/; }
nginx dizeyi /home/www/static/
URL yolunun başına ekler ve sonucu bir dosya sistemi yolu olarak kullanır. Sahte kodda bu şöyle bir şey olurdu:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Bunun ilk dava ile aynı sonucu var, ancak farklı bir sebepten. Hiçbir önek sıyırma, ancak her URL yolu öneki içermelidir beri /robots.txt
, ardından dosya sistemi yolları hep birlikte başlayacak /home/www/static//robots.txt
olan eşdeğerdir /home/www/static/robots.txt
.
Tabii ki, böyle mesela nginx körlemesine ham URL yollarını kullanmaz olarak yalancı kod oldukça, bütün hikayeyi anlatmaz /../../../etc/passwd
, try_files
yönerge davranışını değiştirir root
/ ' alias
ve nereye kısıtlamalar vardır alias
kullanılabilir.
=
her iki durumda da bir kullanabilirsiniz , doğru mu? Yoksa sadece için geçerliroot
mi? Ayrıca, düzenlememi görün - Her ikisini aynı anda kullanmak istemedim. :)