Nginx - รูทกับชื่อแทนสำหรับใช้งานไฟล์เดียว?


66

หลังจากผ่านไปหลายชั่วโมงnginxเพื่อให้บริการไฟล์เดียวเช่นrobots.txt(คำใบ้: ล้างแคชเบราว์เซอร์ของคุณในแต่ละครั้ง) ฉันปิดบังด้วยสองวิธีที่ต่างกันวิธีหนึ่งใช้คำสั่งนามแฝงและอีกวิธีหนึ่งโดยใช้คำสั่งรูทเช่น:

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

มีความแตกต่างในการทำงานระหว่างสองหรือไม่ หรือปัญหาด้านความปลอดภัย? มีข้อขัดแย้งใด ๆ กับคำสั่งอื่น ๆ ? (ทั้งคู่ดูเหมือนจะดีกับตำแหน่งอื่น / คงที่) หรือเหตุผลใดที่จะเลือกอย่างใดอย่างหนึ่งมากกว่าอื่น ๆ ?

หมายเหตุ - ฉันไม่ได้ใช้ทั้งสองอย่างพร้อมกัน :) ฉันลองแต่ละครั้งทีละอันและใช้ได้ทั้งคู่ ฉันไม่ได้ถามว่าพวกเขาทั้งสองมีปฏิสัมพันธ์กันในไฟล์เดียวกันอย่างไร แต่จะใช้อันไหนดีกว่า

คำตอบ:


71

คำสั่งทั้งสองนี้ใช้งานได้แตกต่างกันเล็กน้อยเพราะคุณไม่ได้ใช้การจับคู่แบบตรงในกรณีหลัง ดังนั้น/robots.txt1111จะจับคู่ตำแหน่งที่สองของคุณด้วย
location =/robots.txt { root /home/www/static/; }เทียบเท่ากับคำสั่งแรกของคุณ


จุดดีขอบคุณ แต่คุณสามารถใช้=ทั้งสองกรณีได้ไหม หรือมันใช้เฉพาะกับroot? ดูการแก้ไขของฉันด้วย - ฉันไม่ได้ตั้งใจจะใช้ทั้งสองอย่างพร้อมกัน :)
ไซคลอป

@ ไซคลอปส์ใช่คุณสามารถใช้งานได้=ทั้งสองกรณี
Alexander Azarov

ดังนั้นพวกเขาจะเหมือนกัน - มีเหตุผลใดที่จะเลือกหนึ่งคำสั่งเหนืออีก? เป็นคำถามหลักของฉัน
Cyclops

@ ไซคลอปส์โดยทั่วไปไม่มีเหตุผลเช่นนั้น
อเล็กซ์

41

ใช่มีความแตกต่าง: ด้วย "นามแฝง" คุณสามารถ .. ชื่อแทนดีกับชื่อไฟล์อื่นเช่น

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

แต่ทว่า

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

บังคับให้คุณตั้งชื่อไฟล์ของคุณบนเซิร์ฟเวอร์ด้วย robots.txt ฉันใช้ตัวเลือกแรกเนื่องจากฉันต้องการตั้งชื่อไฟล์ robots ของฉันบนเซิร์ฟเวอร์ของฉันเป็น tld.domain.subdomain-robots.txt เช่น

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

1

ฉันคิดว่ามันคุ้มค่าอย่างชัดเจนว่า 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สามารถนำมาใช้


0

มีความแตกต่างเมื่อนามแฝงสำหรับทั้งไดเรกทอรี

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

จะทำงานในขณะที่

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

จะไม่ทำ สิ่งนี้จะต้องเป็น

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

(ง่ายต่อการสับสน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.