ฉันคิดว่ามันคุ้มค่าอย่างชัดเจนว่า nginx กำลังทำงานบนส่วนนำหน้าและไม่ใช่ไฟล์ต่อไฟล์ ในกรณีแรก
location /robots.txt { alias /home/www/static/robots.txt; }
nginx แทนที่ส่วนนำหน้า สตริง/robots.txt
ในเส้นทาง URL ด้วย/home/www/static/robots.txt
แล้วใช้ผลลัพธ์เป็นเส้นทางของระบบไฟล์ แสดงเป็น pseudocode นี่จะเป็นสิ่งที่ชอบ:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
ดังนั้นจึง/robots.txt
มีการให้บริการ/home/www/static/robots.txt
เนื่องจากการ/robots.txt
ขีดทับส่วน/robots.txt
นำหน้าเป็นสตริงว่างและการผนวกสตริงว่างเพื่อ/home/www/static/robots.txt
ทำให้ไม่มีการเปลี่ยนแปลง แต่/robots.txt1
จะได้รับบริการจาก/home/www/static/robots.txt1
และจะได้รับบริการจาก/robots.txt/foobar
/home/www/static/robots.txt/foobar
ไฟล์เหล่านั้นอาจไม่มีอยู่ทำให้ nginx ส่งการตอบกลับ 404 และอาจเป็นไปได้ว่าrobots.txt
ไม่ใช่ไดเรกทอรีอยู่แล้ว แต่ nginx ไม่ทราบล่วงหน้าและทั้งหมดนี้ขึ้นอยู่กับคำนำหน้าสตริงและไม่ใช่สิ่งที่ดูเหมือนจะเป็นไฟล์ หรือไดเร็กทอรีโดยไม่มีหรือมีสแลชต่อท้าย
ในกรณีที่สอง
location /robots.txt { root /home/www/static/; }
nginx แทรกสตริง/home/www/static/
ที่จุดเริ่มต้นของเส้นทาง URL จากนั้นใช้ผลลัพธ์เป็นเส้นทางของระบบไฟล์ ใน pseudocode นี่จะเป็นสิ่งที่ชอบ:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
สิ่งนี้มีผลเหมือนกับกรณีแรก แต่ด้วยเหตุผลอื่น ไม่มีลอกคำนำหน้าเป็น แต่เนื่องจากทุกเส้นทาง URI มีจะมีคำนำหน้า/robots.txt
แล้วเส้นทางระบบไฟล์มักจะเริ่มต้นด้วย/home/www/static//robots.txt
ซึ่งเทียบเท่ากับ /home/www/static/robots.txt
แน่นอน pseudocode ไม่ค่อยบอกเรื่องราวทั้งหมดเป็นเช่น Nginx จะไม่สุ่มสี่สุ่มห้าใช้เส้นทาง URL ดิบเช่น/../../../etc/passwd
การtry_files
สั่งการเปลี่ยนแปลงลักษณะการทำงานของroot
/ alias
และมีข้อ จำกัด ในการที่alias
สามารถนำมาใช้
=
ทั้งสองกรณีได้ไหม หรือมันใช้เฉพาะกับroot
? ดูการแก้ไขของฉันด้วย - ฉันไม่ได้ตั้งใจจะใช้ทั้งสองอย่างพร้อมกัน :)