วิธีการลบที่ตั้งบล็อกจาก $ uri ในการกำหนดค่า nginx?


16

ฉันมีการเขียนซ้ำในไฟล์ ngix conf ของฉันที่ทำงานได้อย่างถูกต้องยกเว้นดูเหมือนว่าจะรวมบล็อกที่ตั้งเป็นส่วนหนึ่งของตัวแปร $ uri ฉันต้องการเส้นทางหลังจากบล็อกตำแหน่งเท่านั้น รหัสการกำหนดค่าปัจจุบันของฉันคือ:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

การใช้ URL ตัวอย่างของhttp://localhost/cargo/testpageการเปลี่ยนเส้นทางทำงานอย่างไรก็ตามค่าของพารามิเตอร์ "_REWRITE_COMMAND" ที่ได้รับจากไฟล์ php ของฉันคือ "/ cargo / testpage" ฉันต้องถอดบล็อกที่ตั้งออกและมี "testpage" เป็น $ uri

ฉันค่อนข้างมั่นใจว่ามีไวยากรณ์ของ regex เพื่อแยก $ uri และกำหนดให้กับตัวแปรใหม่โดยใช้ $ 1 $ 2 ฯลฯ แต่ฉันไม่พบตัวอย่างใด ๆ ที่จะทำเพียงแค่การกำหนดตัวแปรโดยใช้ regex ที่ไม่ได้เป็นส่วนหนึ่งของการเขียนซ้ำ คำให้การ. ฉันค้นหามาหลายชั่วโมงแล้วและดูเหมือนว่าฉันจะผ่านขั้นตอนสุดท้ายไม่ได้

ฉันรู้ด้วยว่าฉันสามารถดึงสิ่งนี้ออกมาในรหัสแอปพลิเคชันได้ แต่เหตุผลที่ฉันต้องการลองแก้ไขใน nginx conf นั้นก็เพื่อเหตุผลด้านความเข้ากันได้เพราะมันทำงานบน Apache ด้วย ฉันควรจะบอกว่าฉันได้คิดวิธีแฮ็คจริงๆที่จะทำ แต่มันเกี่ยวข้องกับคำสั่ง "ถ้า" เพื่อตรวจสอบการมีอยู่ของไฟล์และเอกสารระบุว่าไม่ให้ทำแบบนั้น

คำตอบ:


18

มองไปรอบ ๆ ฉันจะเดาว่าการใช้ตำแหน่ง regexp กับการจับเป็นวิธีที่ง่ายที่สุด ปรับตัวอย่างของคุณฉันท้ายด้วย:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

aha ง่าย ๆ เมื่อมีคนชี้ให้คุณเห็น! ฉันต้องทำการแก้ไขเล็กน้อยเพื่อจัดการการเขียน url ใหม่ในตำแหน่งที่ถูกต้อง ฉันตอบคำถามเพราะฉันไม่สามารถจัดรูปแบบใด ๆ ในความคิดเห็นนี้ ข้อแม้ที่เหลืออยู่เพียงอย่างเดียวคือบล็อก php ในขณะนี้จะต้องอยู่เหนือบล็อกตำแหน่งนี้มิฉะนั้นจะสร้างลูปการเปลี่ยนเส้นทางแบบไม่สิ้นสุด (เนื่องจาก / cargo เป็น regex และ URL การเปลี่ยนเส้นทางยังมี / cargo) ไม่แน่ใจว่ามีวิธีอื่นในการป้องกันไม่ให้เกิดขึ้นหรือไม่
เจสัน

ฉันขอแนะนำให้อ่านข้อมูลเกี่ยวกับการสั่งซื้อของตำแหน่ง regexp และที่ไม่ใช่ regexp ฉันมักจะหันไปทำให้ทุกสถานที่ regexp ในบางจุดเพราะจากนั้นการสั่งซื้อจะถูกกำหนดโดยคำสั่งในไฟล์ config แทนที่จะเป็นความจำเพาะของการจับคู่
Theuni

เจ๋งขอบคุณฉันคิดว่าสิ่งที่จะทำให้ regex ข้างต้นดีกว่าถ้ามันตรงกับ / ขนส่งสินค้า / (อะไรยกเว้น index.php) แล้วที่จะป้องกันข้อผิดพลาดเซิร์ฟเวอร์เนื่องจากการเขียนวนซ้ำไม่สิ้นสุด
Jason

3

ฉันพบสิ่งอื่นที่เหมาะกับฉัน (ขณะที่ฉันใช้ gunicorn ฉันไม่สามารถเลือกได้ว่าจะผ่านอะไร)

คุณควรจะไปกับ

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

สำหรับผู้ที่อาจต้องดิ้นรนเพื่อเพิ่มบริการไมโครหรือ API ด้วย Node JS ฉันใช้ต่อไปนี้เพื่อลบออกapiจาก url บนเซิร์ฟเวอร์ของฉัน:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.