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