วิธีการติดตามการเปลี่ยนเส้นทาง HTTP ภายใน nginx


15

ฉันมีพร็อกซี HTTP ที่ใช้ nginx และฉันต้องการประมวลผลการเปลี่ยนเส้นทาง HTTP ทั้งหมดภายในเพื่อให้ลูกค้าได้รับการตอบกลับล่าสุดในเชนการเปลี่ยนเส้นทางเท่านั้น

รหัสพื้นฐานดูเหมือนว่า:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}

ความพยายามของฉันในการเปลี่ยนเส้นทาง 1 ระดับดังต่อไปนี้คือ:

error_page 301 302 307 =200 @redir;

... และมีที่ตั้งชื่อนี้:

location @redir {
    proxy_pass $proxy_location;
}

มีเพียงตัวแปร $ proxy_location และฉันไม่สามารถหาวิธีสร้างมันได้ มันควรมีค่าของLocation:ส่วนหัวที่ได้รับจากต้นน้ำ

ความคิดใด ๆ

คำตอบ:


7

ผมเชื่อว่าคุณต้องการตัวแปร$ upstream_http_location

ตัวแปรที่เริ่มต้นด้วย $ proxy * ควบคุมสิ่งที่เปลี่ยนจาก nginx เป็น upstream ชุดตัวแปร $ upstream * มีข้อมูลเกี่ยวกับการตอบสนองที่ nginx ได้รับ คุณสามารถรับส่วนหัว HTTP โดยไม่ได้ตั้งใจใด ๆ ที่ได้รับจากเซิร์ฟเวอร์ upstream ด้วย $ upstream_http_headername

โปรดทราบว่าตัวแปร $ upstream เหล่านี้ไม่สามารถเป็นอะไรได้นอกจากเป็นโมฆะจนกว่าจะได้รับการตอบกลับจากเซิร์ฟเวอร์ upstream ดังนั้นจึงมีข้อ จำกัด ในการใช้งาน


26

นี่คือตัวอย่างเต็มรูปแบบของสิ่งที่ได้ผลสำหรับฉัน:

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}

1
ทำไมคุณต้องบันทึกค่าของ $ upstream_http_location ในตัวแปรใหม่
Parth Shah

1
ฉันไม่ทราบเหตุผลที่แน่นอน แต่ไม่สามารถใช้งานได้ ...
Vlad Frolov

นี่ยอดเยี่ยม แต่จับการเปลี่ยนเส้นทางเดียว วิธีใดในการจัดการการเปลี่ยนเส้นทางหลายครั้ง
ThiefMaster

1
@ThiefMaster ฉันเชื่อว่าคำตอบนี้คือสิ่งที่คุณกำลังมองหา
iBug

ฉันได้รับข้อผิดพลาดต่อไปนี้2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"โดยใช้ @handle_redirect block ความคิดใด ๆ
Cyril Duchon-Doris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.