Nginx - tek dosya sunumu için kök takma isme karşı?


66

Saatlerce bekledikten sonra nginxtek tek dosyalar yayınladıktan sonra robots.txt(ipucu: tarayıcı önbelleğini her defasında temizle ), biri diğer adı direktifini kullanarak ve biri de kök direktifini kullanarak iki farklı yolla başladım :

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

İkisi arasında herhangi bir işlevsel fark var mı ? Veya güvenlik sorunları? Diğer direktiflerle herhangi bir çatışma var mı? (Her ikisi de başka bir / statik konumla iyi görünüyordu). Ya da diğerini seçmek için herhangi bir sebep?

Not - Her ikisini de aynı anda kullanmadım :) Aksine, her defasında bir tane denedim ve ikisi de çalıştı. İkisinin de aynı dosyada nasıl etkileşime girdiğini sormuyorum, hangisinin daha iyi kullanılması gerektiğini soruyorum.

Yanıtlar:


71

Eh, bu iki yönerge biraz işlevseldir çünkü ikinci durumda tam eşleşme kullanmazsınız. Yani, /robots.txt1111ikinci konumunuzla da eşleşecek.
location =/robots.txt { root /home/www/static/; }ilk direktifinizin tam bir işlevsel karşılığıdır.


İyi nokta, teşekkürler. Ama =her iki durumda da bir kullanabilirsiniz , doğru mu? Yoksa sadece için geçerli rootmi? Ayrıca, düzenlememi görün - Her ikisini aynı anda kullanmak istemedim. :)
Cyclops

@Cyclops evet, =her iki durumda da kullanabilirsiniz .
Alexander Azarov

Yani onlar da aynı olurdu - birini diğerine yönlendirmek için herhangi bir sebep var mı? Asıl sorum bu.
Cyclops

@ Cyclops Temel olarak, böyle bir sebep yoktur.
Alex,

41

Evet, bir fark var: "takma ad" ile yapabilirsiniz ... başka bir dosya adına iyi takma ad,

location /robots.txt { alias /home/www/static/any-filename.txt; }

buna karşılık

location /robots.txt { root /home/www/static/; }

sunucuda da dosya adınızı zorlarlar robots.txt. İlk dosyaları kullanıyorum çünkü robot dosyalarımı sunucumda tld.domain.subdomain-robots.txt; Örneğin

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }

1

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.txtve 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.txtservis edilir /home/www/static/robots.txtçünkü /robots.txtelimden /robots.txtönek boş dize ve boş dize ekleyerek /home/www/static/robots.txtdeğişmeden bırakır. Ancak, /robots.txt1o hizmet /home/www/static/robots.txt1ve /robots.txt/foobarolacaktı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.txtbir 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.txtolan 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_filesyönerge davranışını değiştirir root/ ' aliasve nereye kısıtlamalar vardır aliaskullanılabilir.


0

Takma ad tam bir dizin için olduğunda fark vardır.

    location ^~ /data/ { alias /home/www/static/data/; }

çalışacak

    location ^~ /data/ { root /home/www/static/data/; }

yapmayacağım. Bu olmalı

    location ^~ /data/ { root /home/www/static/; }

(Karıştırması kolaydır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.