Score:0

วิธีการเปลี่ยนเส้นทาง nginx โดยไม่รวมที่อยู่ IP และเส้นทาง

ธง fr

ฉันต้องเปลี่ยนเส้นทางไปยัง URL เว้นแต่ว่าผู้ใช้จะมาจากภายในที่อยู่ IP ภายในของเรา หรือ หากพวกเขากำลังเข้าถึงเส้นทางใดเส้นทางหนึ่ง

ฉันได้ลองสิ่งนี้แล้ว:

ตำแหน่ง ~* /foobar {
    หยุดพัก;
}

ตำแหน่ง ~* / {
    ถ้า ($remote_addr != 111.222.333.444) {
        เขียนใหม่ ^ https://external.tld/
    }
}

แต่นั่นดูเหมือนจะไม่ได้ผล การกำหนดค่าเฉพาะนั้นทำให้เกิด 404 เมื่อไปที่ https://mydomain.tld/foobar และ "ยินดีต้อนรับสู่ nginx!" หน้าเมื่อเข้าถึงได้จากภายในที่อยู่ IP ของเรา อย่างไรก็ตามการเข้าถึง https://mydomain.tld/foobar ภายนอกที่อยู่ IP ของเราจะเปลี่ยนเส้นทางไปอย่างถูกต้อง https://external.tld/

djdomi avatar
za flag
คำถามที่ต้องการความช่วยเหลือในการติดตั้ง การกำหนดค่า หรือการวินิจฉัยต้องรวมถึงสถานะสิ้นสุดที่ต้องการ ปัญหาหรือข้อผิดพลาดเฉพาะ ข้อมูลที่เพียงพอเกี่ยวกับการกำหนดค่าและสภาพแวดล้อมเพื่อทำซ้ำ และพยายามแก้ไข คำถามที่ไม่มีคำชี้แจงปัญหาที่ชัดเจนไม่เป็นประโยชน์สำหรับผู้อ่านรายอื่นและไม่น่าจะได้รับคำตอบที่ดี
Darrell Brogdon avatar
fr flag
@djdomi คุณแนะนำอะไรเพื่อทำให้คำชี้แจงปัญหาชัดเจนขึ้น
djdomi avatar
za flag
แสดงให้เราเห็น nginx -T และอธิบายสิ่งที่ไม่ได้ผล ตอนนี้คุณบอกเราแค่ครึ่งทาง ;)
Darrell Brogdon avatar
fr flag
@djdomi ขอบคุณครับ ฉันได้เพิ่มคำอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นกับการกำหนดค่าที่กำหนด ขออภัย ฉันไม่ได้รับอนุญาตให้โพสต์ผลลัพธ์ของ `nginx -T`
djdomi avatar
za flag
หากเป็นเพียง url เดียว โดเมนย่อยก็ทำได้เช่นกัน
Darrell Brogdon avatar
fr flag
ไม่ มีเพียง URL เดียวเท่านั้น
Score:1
ธง gr

เนื่องจากคุณไม่ต้องการ (หรือไม่อนุญาต) ให้แสดงการบล็อกเซิร์ฟเวอร์ทั้งหมดของคุณ ฉันจะคาดเดาบางอย่าง เกิดอะไรขึ้นกับการกำหนดค่าของคุณมากที่สุด คุณสร้างบล็อกตำแหน่งเพิ่มเติมสองบล็อกซึ่งใช้ในการประมวลผล ใดๆ คำขอที่เข้ามา ตรวจสอบ ที่ตั้ง คำสั่ง เอกสาร. สถานที่เพียง 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 เดียว คุณสามารถใช้หลายรายการได้ ถ้า (...) { แตก; } บล็อก

โพสต์คำตอบ

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