regex ตำแหน่ง Nginx ไม่สามารถใช้งานได้กับการผ่านพรอกซี


43

ฉันกำลังพยายามทำให้คำสั่งตำแหน่ง 2 ตำแหน่งเหล่านี้ทำงานใน Nginx แต่ฉันได้รับข้อผิดพลาดกลับมาเมื่อทำการบูท Nginx

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

นี่เป็นข้อผิดพลาดที่ฉันได้รับ:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

มันฟังดูคุ้นหูกับทุกคนไหม? สิ่งที่ฉันหายไปที่นี่

คำตอบ:


48

นอกจากนี้เล็ก ๆ เพื่อคำตอบที่ดีจากXaviar :

หากคุณไม่คุ้นเคยกับ nginx เป็นอย่างดีมีความแตกต่างที่สำคัญระหว่างการเพิ่มเครื่องหมายสแลชที่ส่วนท้ายของproxy_passคำสั่ง

ต่อไปนี้ใช้ไม่ได้ :

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

แต่อันนี้ทำ:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

ความแตกต่างคือ/ตอนท้ายของproxy_passคำสั่ง


1
ส่วนท้ายนั้น/แก้ไขปัญหาการกำหนดค่าของฉันมันจับยากขอบคุณ!
yorch

ขอบคุณที่ชี้ให้ฉันเห็น!
cyrrill

20

มันบอกคุณว่าURIในคำสั่งการส่งผ่านพรอกซีไม่สามารถใช้ในตำแหน่ง regex นี่เป็นเพราะ nginx ไม่สามารถแทนที่ส่วนของ URI ที่ตรงกับ regex ในlocationบล็อกด้วยสิ่งที่ส่งผ่านในproxy_passdirective เป็นวิธีทั่วไป

เพียงแค่จินตนาการ regex ตำแหน่งของคุณ/foo/(.*)/barและคุณระบุproxy_pass http://server/test, Nginx จะต้อง map regex สถานที่ของคุณไปยังอีกที่หนึ่งในระดับบนเพราะคุณไม่ต้องการที่จะจบลงด้วยแต่มี/foo/test/bar/something /test/somethingดังนั้นมันจึงเป็นไปไม่ได้

ดังนั้นสำหรับส่วนนี้โดยใช้สิ่งต่อไปนี้ควรทำงาน:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

อย่างไรก็ตามมันเป็นไปไม่ได้ที่จะเขียนการเปลี่ยนเส้นทางให้ตรงกับรูปแบบ URI ของบล็อกสถานที่เนื่องจากจะเขียน URI ปัจจุบันที่กำลังประมวลผลทำให้ไม่สามารถเปลี่ยนLocationส่วนหัวตามคำขอเริ่มต้นก่อนเขียนซ้ำได้


2
การย้ายเส้นทางไปสู่กฎการเขียนซ้ำที่ใช้งานได้สำหรับฉัน ขอบคุณ
sonjz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.