Nginx - root versus alias, untuk menyajikan file tunggal?


66

Setelah berjam-jam nginxmelayani file tunggal seperti robots.txt(petunjuk: kosongkan cache browser Anda setiap kali), saya berakhir dengan dua cara berbeda, satu menggunakan alias directive, dan satu menggunakan directive root , seperti:

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

Apakah ada perbedaan fungsional antara keduanya? Atau masalah keamanan? Adakah konflik dengan arahan lain? (Keduanya tampak baik-baik saja dengan lokasi lain / statis). Atau ada alasan untuk memilih satu dari yang lain?

Catatan - Saya tidak menggunakan keduanya pada saat yang sama :) Sebaliknya saya mencoba masing-masing, satu per satu, dan keduanya bekerja. Saya tidak bertanya bagaimana mereka berdua berinteraksi bersama dalam file yang sama, tetapi mana yang lebih baik untuk digunakan.

Jawaban:


71

Nah, kedua arahan ini sedikit berbeda fungsional karena Anda tidak menggunakan kecocokan tepat dalam kasus terakhir. Jadi, /robots.txt1111akan cocok dengan lokasi kedua Anda juga.
location =/robots.txt { root /home/www/static/; }adalah ekuivalen fungsional yang tepat dari arahan pertama Anda.


Poin bagus, terima kasih. Tetapi Anda dapat menggunakan =dalam kedua kasus, benar? Atau apakah itu hanya berlaku untuk root? Lihat juga hasil edit saya - saya tidak bermaksud menggunakan keduanya sekaligus. :)
Cyclops

@ Cyclops ya, Anda dapat menggunakan =dalam kedua kasus.
Alexander Azarov

Jadi mereka akan sama - apakah ada alasan untuk memilih satu arahan dari yang lain? Apakah pertanyaan utama saya.
Cyclops

@ Cyclops Pada dasarnya, tidak ada alasan seperti itu.
Alex

41

Ya, ada perbedaan: Dengan "alias" Anda bisa .. baik alias ke nama file lain, seperti

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

sedangkan

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

memaksa Anda untuk memberi nama file Anda di server juga robots.txt. Saya menggunakan opsi pertama karena saya ingin memberi nama file robot saya di server saya sebagai tld.domain.subdomain-robots.txt; misalnya

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

1

Saya pikir itu layak secara eksplisit menyatakan bahwa nginx beroperasi pada awalan dan bukan file per se. Dalam kasus pertama,

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

nginx menggantikan awalan string /robots.txtdi jalur URL dengan /home/www/static/robots.txtdan kemudian menggunakan hasilnya sebagai jalur sistem file. Diwakili sebagai kodesemu, ini akan menjadi sesuatu seperti:

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
    serveFile(fsPath)
}

Jadi /robots.txtdilayani dari /home/www/static/robots.txtkarena /robots.txtdilucuti dari /robots.txtawalan adalah string kosong, dan menambahkan string kosong untuk /home/www/static/robots.txtmembiarkannya tidak berubah. Tetapi, /robots.txt1akan dilayani dari /home/www/static/robots.txt1dan /robots.txt/foobarakan dilayani dari /home/www/static/robots.txt/foobar. File-file itu mungkin tidak ada, menyebabkan nginx mengirim respons 404, dan kemungkinan itu robots.txtbukan direktori, tapi nginx tidak tahu sebelumnya, dan ini semua didasarkan pada awalan string dan bukan apa yang tampak sebagai file atau direktori dengan tidak adanya atau adanya garis miring.

Padahal, dalam kasus kedua,

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

nginx menyisipkan string /home/www/static/di awal jalur URL dan kemudian menggunakan hasilnya sebagai jalur sistem file. Dalam pseudocode, ini akan menjadi sesuatu seperti:

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/" + urlPath
    serveFile(fsPath)
}

Ini memiliki hasil yang sama persis dengan kasus pertama, tetapi karena alasan yang berbeda. Tidak ada stripping awalan, tetapi karena setiap jalur URI harus berisi awalan /robots.txt, maka jalur sistem file akan selalu dimulai dengan /home/www/static//robots.txtyang setara dengan /home/www/static/robots.txt .

Tentu saja, kodesemu tidak cukup menceritakan keseluruhan cerita, seperti misalnya nginx tidak akan secara buta menggunakan jalur URL mentah seperti /../../../etc/passwd, try_filesarahan mengubah perilaku root/ alias, dan ada kendala di mana aliasdapat digunakan.


0

Ada perbedaan, ketika alias untuk seluruh direktori.

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

akan bekerja, sementara

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

tidak akan melakukannya. Ini harus terjadi

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

(Mudah bingung)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.