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.
=dalam kedua kasus, benar? Atau apakah itu hanya berlaku untukroot? Lihat juga hasil edit saya - saya tidak bermaksud menggunakan keduanya sekaligus. :)