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.txt
di jalur URL dengan /home/www/static/robots.txt
dan 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.txt
dilayani dari /home/www/static/robots.txt
karena /robots.txt
dilucuti dari /robots.txt
awalan adalah string kosong, dan menambahkan string kosong untuk /home/www/static/robots.txt
membiarkannya tidak berubah. Tetapi, /robots.txt1
akan dilayani dari /home/www/static/robots.txt1
dan /robots.txt/foobar
akan dilayani dari /home/www/static/robots.txt/foobar
. File-file itu mungkin tidak ada, menyebabkan nginx mengirim respons 404, dan kemungkinan itu robots.txt
bukan 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.txt
yang 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_files
arahan mengubah perilaku root
/ alias
, dan ada kendala di mana alias
dapat digunakan.
=
dalam kedua kasus, benar? Atau apakah itu hanya berlaku untukroot
? Lihat juga hasil edit saya - saya tidak bermaksud menggunakan keduanya sekaligus. :)