Score:1

อะไรคือความแตกต่างระหว่าง $uri และ $uri/ ในคำสั่ง try_files?

ธง in

นี่คือการกำหนดค่า:

ดัชนี index.html;
ที่ตั้ง / {
    try_files $uri $uri/ = 404;
}

ฉันส่งคำขอที่ http://localhost/path/a/ ฉันคิดว่านี่คือ URI ดังนั้นที่ $uri สเตจ try_files จะดูที่ /path/a/ และให้บริการ index.html หากมี

ฉันอ่านจากเอกสารที่ สามารถตรวจสอบการมีอยู่ของไดเร็กทอรีได้โดยการระบุเครื่องหมายทับที่ท้ายชื่อ เช่น â$ยูริ/â แต่สิ่งนี้ไม่สมเหตุสมผลสำหรับฉัน

Score:0
ธง gr

มันอยู่ตรงที่ $uri/ ส่วนที่ทำให้ nginx สมมติว่า URI สามารถเป็นชื่อไดเร็กทอรีและค้นหาไฟล์ดัชนีที่อยู่ภายใน

สมมติโครงสร้างไดเร็กทอรีต่อไปนี้:

/var/www/html
         âââ ก
         â âââ ดัชนี.html
         âââ ข
         â âââ ดัชนี.html
         â âââ ดัชนี.htm
         âââ ค
         â âââ test.html
         ...

และการกำหนดค่า nginx ต่อไปนี้:

เซิร์ฟเวอร์ {
    รูท /var/www/html;
    ดัชนี index.htm index.html;
    ที่ตั้ง / {
        try_files $uri $uri/ =404;
    }
}

นี่คือสิ่งที่เกิดขึ้นต่อไปนี้ ขด คำขอ:

  • ขด http://localhost/a
    

    ส่งคืนการเปลี่ยนเส้นทาง:

    HTTP/1.1 301 ย้ายอย่างถาวร
    ที่ตั้ง: http://localhost/a/
    
  • ขด http://localhost/a/
    

    คืนค่า /var/www/html/a/index.html เนื้อหาไฟล์

  • ขด http://localhost/b
    

    ส่งคืนการเปลี่ยนเส้นทาง:

    HTTP/1.1 301 ย้ายอย่างถาวร
    ที่ตั้ง: http://localhost/b/
    
  • ขด http://localhost/b/
    

    คืนค่า /var/www/html/b/index.htm เนื้อหาไฟล์ (มีการตรวจสอบการมีอยู่ของไฟล์ดัชนีตามลำดับที่ระบุโดยใช้ไฟล์ ดัชนี คำสั่ง).

  • ขด http://localhost/c
    

    ส่งคืนการเปลี่ยนเส้นทาง:

    HTTP/1.1 301 ย้ายอย่างถาวร
    ที่ตั้ง: http://localhost/c/
    
  • ขด http://localhost/c/
    

    เนื่องจากไม่มีไฟล์ดัชนีในไฟล์ /var/www/html/c/ ไดเร็กทอรี, ขด คำสั่งจะส่งคืนไฟล์ HTTP 403 ถูกห้าม เว้นแต่คุณจะมี เปิดดัชนีอัตโนมัติ; คำสั่งในการกำหนดค่าของคุณ (ในกรณีนั้น nginx จะส่งคืนไฟล์ /var/www/html/c/ รายการไดเรกทอรี)

หากการกำหนดค่า nginx ของคุณจะมีลักษณะดังนี้

เซิร์ฟเวอร์ {
    รูท /var/www/html;
    ดัชนี index.htm index.html;
    ที่ตั้ง / {
        try_files $uri =404;
    }
}

คำขอแต่ละรายการข้างต้นจะส่งกลับค่า ไม่พบ HTTP 404 ข้อผิดพลาด. หนึ่ง ดัชนีอัตโนมัติ คำสั่งถ้ามีอยู่จะไม่มีผล วิธีเดียวที่จะได้รับ index.html เนื้อหาจะต้องระบุอย่างชัดเจนเช่น http://localhost/a/index.html, http://localhost/b/index.htm เป็นต้น

สิ่งที่สำคัญมากแต่ไม่ชัดเจนอย่างยิ่งคือ ดัชนี คำสั่งที่ใช้กับ try_files $uri $uri/ =404 อาจทำให้เกิดการเปลี่ยนเส้นทางภายใน ตัวอย่างเช่น ถ้าคุณจะมีการกำหนดค่าต่อไปนี้:

เซิร์ฟเวอร์ {
    รูท /var/www/html;
    ดัชนี index.htm index.html;
    ที่ตั้ง / {
        add_header X-Test ทดสอบ 1;
        try_files $uri $uri/ =404;
    }
    ตำแหน่ง /a/index.html {
        add_header X-Test ทดสอบ 2;
    }
}

ขอ http://localhost/a/ จะทำให้เกิดการเปลี่ยนเส้นทางภายในจาก /a/ ถึง /a/index.html และส่งคืน /var/www/html/a/index.html เนื้อหาไฟล์ด้วยกำหนดเอง X-ทดสอบ ส่วนหัวตั้งค่าเป็น ทดสอบ2ไม่ถึง ทดสอบ1!

สิ่งสุดท้ายที่ควรกล่าวถึงก็คือ try_files $uri $uri/ =404; เป็นพฤติกรรมเริ่มต้นของ nginx ดังนั้น

ที่ตั้ง / {
    try_files $uri $uri/ =404;
}

และ

ที่ตั้ง / {}

สถานที่เท่าเทียมกันโดยสิ้นเชิง

อัปเดต

คำถามเพิ่มเติมจาก OP:

ความคิดของฉันคือ: $ยูริ ตรวจสอบ URI ตามที่เป็นอยู่ และ $uri/ ตรวจสอบ URI เป็นไดเร็กทอรีที่ค้นหาไฟล์ดัชนี สำหรับ http://localhost/a กับ try_files $uri /file.html =404; ฉันเข้าใจ file.html. ดีสำหรับตอนนี้! สำหรับ http://localhost/a กับ try_files $uri/ /file.html =404; ฉันเข้าใจ file.html ด้วย. ทำไม ฉันคาดหวังว่า index.html. นอกจากนี้, try_files $uri $uri/ /file.html =404; จะได้รับฉัน index.html.

เป็นคำถามที่ดีมาก! คำตอบทั้งหมดจะไม่สมบูรณ์ มาดูกันว่าเกิดอะไรขึ้นที่นี่

มี http://localhost/a/ ขอและ try_files $uri/ /file.html =404; คำสั่งในการกำหนดค่า nginx ของคุณ ในขั้นตอนแรก nginx ตรวจสอบไฟล์ /var/www/html/a/ ไดเร็กทอรีสำหรับการเป็นไดเร็กทอรี ถัดไปตรวจสอบการมีอยู่ของไฟล์ดัชนี พบไฟล์ index.html ไฟล์ภายในนั้นและสร้างการเปลี่ยนเส้นทางภายในจาก /a/ ถึง /a/index.html. ในขั้นตอนที่สอง อยู่ในบล็อกตำแหน่งเดียวกัน nginx ตรวจสอบ /var/www/html/a/index.html เพื่อเป็นไดเร็กทอรี แต่มันไม่ใช่! และเนื่องจากคุณไม่มี $ยูริ ส่วนประกอบเป็น try_files พารามิเตอร์คำสั่งจะไปสำหรับการตรวจสอบต่อไปสำหรับ /var/www/html/file.html ไฟล์พบและส่งคืนเนื้อหา

คุณอาจคิดว่าการใช้ try_files คำสั่งโดยไม่ต้อง $ยูริ พารามิเตอร์จึงไร้ประโยชน์โดยสิ้นเชิง โดยปกติจะเป็น แต่อาจเป็นกรณีการใช้งานได้ เช่น เมื่อคุณต้องการซ่อนโครงสร้างภายในไซต์ของคุณ นี่คือตัวอย่าง:

เซิร์ฟเวอร์ {
    รูท /var/www/html;
    ดัชนี index.html;
    ที่ตั้ง / {
        try_files $uri/ =404;
    }
    ตำแหน่ง ~ /index\.html$ {
        ภายใน; # เข้าถึงได้ผ่านการเขียนซ้ำ URI ภายในเท่านั้น
        try_files $uri =404;
    }
    ตำแหน่ง ~ \.(js|css|jpe?g|png)$ {
        #ให้บริการทรัพย์สินด้วยวิธีปกติ
        try_files $uri =404;
    }
}

ทำอย่างนั้น ตำแหน่ง ~ /index\.html$ { ... } ภายในคุณป้องกันการเข้าถึงของคุณโดยตรง index.html ไฟล์ผ่านการร้องขอเช่น http://localhost/a/index.html (หนึ่ง ไม่พบ HTTP 404 จะคืนให้แทน) อย่างไรก็ตามคำขอเช่น http://localhost/a/ ยังคงใช้งานได้เนื่องจาก URI ภายในเขียนใหม่โดย ดัชนี คำสั่งร่วมกับ try_files $uri/ =404 หนึ่ง.

lafleur avatar
in flag
คำอธิบายที่ยอดเยี่ยม! ความคิดของฉันคือ: $uri ตรวจสอบ URI ตามที่เป็นอยู่และ $uri/ ตรวจสอบ URI เป็นไดเร็กทอรีที่มองหาไฟล์ดัชนี สำหรับ http://localhost/a `try_files $uri /file.html = 404; ` ฉันได้รับ file.html ดีสำหรับตอนนี้! สำหรับ http://localhost/a `try_files $uri/ /file.html = 404; ` ฉันได้รับ file.html ด้วย ทำไม ฉันคาดหวัง index.html นอกจากนี้ `try_files $uri $uri/ /file.html = 404;` จะให้ index.html แก่ฉัน
Ivan Shatsky avatar
gr flag
คำถามที่ดี! ดูการอัปเดตคำตอบ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา