ฉันคิดว่ามันคุ้มค่าอย่างชัดเจนว่า 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? ดูการแก้ไขของฉันด้วย - ฉันไม่ได้ตั้งใจจะใช้ทั้งสองอย่างพร้อมกัน :)