มันอยู่ตรงที่ $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 หนึ่ง.