เนื่องจากคุณไม่ต้องการ (หรือไม่อนุญาต) ให้แสดงการบล็อกเซิร์ฟเวอร์ทั้งหมดของคุณ ฉันจะคาดเดาบางอย่าง เกิดอะไรขึ้นกับการกำหนดค่าของคุณมากที่สุด คุณสร้างบล็อกตำแหน่งเพิ่มเติมสองบล็อกซึ่งใช้ในการประมวลผล ใดๆ คำขอที่เข้ามา ตรวจสอบ ที่ตั้ง
คำสั่ง เอกสาร. สถานที่เพียง 2 ประเภทที่สามารถแซงหน้าคำขอจากตำแหน่งที่ตรงกับนิพจน์ทั่วไปคือตำแหน่งที่แน่นอน (สถานที่ = /uri { ... }
) และตำแหน่งคำนำหน้า do-not-check-regex (ที่ตั้ง ^~ /คำนำหน้า { ... }
). มิฉะนั้น ระบบจะเลือกตำแหน่งที่ตรงกับ regex แรก
บล็อกเซิร์ฟเวอร์ทุกบล็อกมีไดเร็กทอรีรูท แม้ว่าจะไม่ได้ระบุอย่างชัดเจนโดยใช้ไฟล์ ราก
คำสั่ง มันถูกเลือกใช้ คำนำหน้า (ระบุที่ เวลารวบรวมสามารถตรวจสอบได้กับ nginx -V
คำสั่ง) และ /html
คำต่อท้าย สมมติว่าคำนำหน้า nginx ของคุณคือ /usr/share/nginx
. จากนั้นรูทเริ่มต้นของคุณจะอยู่ที่ /usr/share/nginx/html
ไดเร็กทอรี เว้นแต่จะระบุไว้อย่างชัดเจนโดยใช้ไฟล์ ราก / บาง / เส้นทาง
คำสั่ง
พฤติกรรม nginx เริ่มต้นเมื่อให้บริการคำขอสามารถอธิบายได้ดังนี้ try_files $uri $uri/ =404
.
สมมติว่าเรามี https://mydomain.tld/foobar
ขอ. เพื่อให้บริการครั้งแรกของคุณ ตำแหน่ง ~* /foobar { พัก; }
จะถูกเลือกให้เป็นตำแหน่ง regex ที่ตรงกันตำแหน่งแรก คำสั่งแรก หยุดพัก
หมายความว่าการประมวลผลชุดปัจจุบันของ ngx_http_rewrite_module
คำสั่งจะหยุดลง แต่ไม่มีคำสั่งใด ๆ เหล่านั้น (ยกเว้น หยุดพัก
หนึ่ง) ภายในบล็อกตำแหน่งนี้! ใช่หมายความว่าสิ่งนี้ หยุดพัก
คำสั่งไม่มีประโยชน์ที่นี่ ถัดไป nginx จะตรวจสอบการมีอยู่ของไฟล์ /usr/share/nginx/html/foobar
ไฟล์, ไฟล์ดัชนีจากไฟล์ /usr/share/nginx/html/foobar/
ไดเร็กทอรี (ค่าเริ่มต้นคือ index.html
) และหลังจากการตรวจสอบทั้งสองล้มเหลว ให้ส่งคืน an ไม่พบ HTTP 404
ข้อผิดพลาด.
ตอนนี้สมมติว่าเรามี https://mydomain.tld/
ขอ. บล็อกตำแหน่งแรกของคุณจะไม่ตรงกัน ดังนั้นบล็อกที่สอง ตำแหน่ง ~* / { ... }
ได้รับเลือกให้ดำเนินการตามคำขอนี้ (บล็อกตำแหน่งนี้จะตรงกับคำขอที่ถูกต้องใดๆ ที่เป็นไปได้) หากไม่ผ่านการตรวจสอบที่อยู่ IP การเปลี่ยนเส้นทางจะเข้ามาแทนที่ แต่ถ้าผ่านไปได้ nginx จะดำเนินการตามคำขอของคุณด้วยวิธีเดียวกับที่อธิบายไว้ด้านบน ส่งคืนการต้อนรับเริ่มต้นของคุณ index.html
ไฟล์จาก /usr/share/nginx/html/
ไดเรกทอรี
ดูเหมือนคุณจะไม่เข้าใจว่าคำสั่งจาก ngx_http_rewrite_module
กำลังประมวลผล อ่านส่วนแรกของเอกสารอีกครั้ง:
เดอะ หยุดพัก
, ถ้า
, กลับ
, เขียนใหม่
, และ ชุด
คำสั่งดำเนินการตามลำดับต่อไปนี้:
- คำสั่งของโมดูลนี้ที่ระบุในระดับเซิร์ฟเวอร์จะดำเนินการตามลำดับ
- ซ้ำๆ:
- สถานที่ถูกค้นหาตาม URI คำขอ
- คำสั่งของโมดูลนี้ที่ระบุภายในตำแหน่งที่พบจะดำเนินการตามลำดับ
- การวนซ้ำจะเกิดขึ้นซ้ำหาก URI คำขอถูกเขียนใหม่ แต่ไม่เกิน 10 ครั้ง
คุณสามารถวางเช็คของคุณที่ระดับบล็อกของเซิร์ฟเวอร์:
ถ้า ($uri = /foobar) {
หยุดพัก;
}
ถ้า ($remote_addr != 111.222.333.444) {
เขียนใหม่ ^ https://external.tld/
}
ข้างบน หยุดพัก
คำสั่งจะทำงานตามที่คาดไว้ การดำเนินการของ ngx_http_rewrite_module
คำสั่งในระดับเซิร์ฟเวอร์จะหยุดลง นั่นหมายความว่าคำสั่งอื่นใดจากโมดูลนั้น (เช่น ชุด
, ถ้า
, กลับ
, เขียนใหม่
ฯลฯ) ถ้ามีควรวางไว้ ก่อน บล็อกด้านบน ที่ใช้ไม่ได้กับการ ngx_http_rewrite_module
คำสั่งวางไว้ที่ระดับตำแหน่ง
มีข้อแม้ที่เป็นไปได้อีกอย่างหนึ่ง ถ้าคุณ https://mydomain.tld/foobar
หน้าใช้เนื้อหาใด ๆ (สคริปต์ สไตล์ รูปภาพ ฯลฯ) ควรอนุญาตให้เข้าถึงเนื้อหาเหล่านั้นด้วย ตัวอย่างเช่น คุณสามารถเปลี่ยนเงื่อนไขเพื่ออนุญาตสิ่งที่เริ่มต้นด้วย /ฟูบาร์
คำนำหน้านามโดยใช้ ถ้า ($uri ~* ^/foobar) { แตก; }
บล็อก. หากไม่สามารถตรวจสอบที่อยู่ของพวกเขาด้วย regex เดียว คุณสามารถใช้หลายรายการได้ ถ้า (...) { แตก; }
บล็อก