Nginx: ฉันจะส่งต่อคำร้องขอ http ไปยังพอร์ตอื่นได้อย่างไร


65

สิ่งที่ฉันต้องการจะทำคือ

เมื่อมีคนเยี่ยมชมhttp://localhost/route/abcเซิร์ฟเวอร์ตอบสนองเหมือนกันทุกประการhttp://localhost:9000/abc

ตอนนี้ฉันกำหนดค่า Nginx ของฉันเช่นนี้:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

http การร้องขอถูกส่งพอร์ต9000อย่างถูกต้อง แต่เส้นทางที่ได้รับคือไม่ได้http://localhost:9000/route/abchttp://localhost:9000/abc

ข้อเสนอแนะใด ๆ

คำตอบ:


65

ฉันเกลียดความละเอียดอ่อนที่นี่ แต่ลองเพิ่ม / ณ สิ้น 9000 ตามด้านล่าง จะไม่เพิ่ม "เส้นทาง" ต่อท้ายคำขอที่ส่งต่อในขณะนี้

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}

4
นี่ควรเป็นคำตอบที่ยอมรับได้ การเพิ่มเพียง/อย่างเดียวนั้นได้รับการบันทึกไว้เป็นวิธีการลบคำนำหน้าที่ระบุไว้ในตำแหน่ง
เบอร์นาร์ด

40

ฉันเชื่อว่าคุณสามารถใช้การเขียนซ้ำเพื่อลบส่วนเพิ่มเติมของ URL ในกรณีของคุณฉันคิดว่าคุณสามารถใช้:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

อย่างไรก็ตามหากแอปของคุณมีลิงก์ภายในอยู่แอปนั้นอาจยังคงชี้ไปที่ / abc / foo และถ้าคุณทำเช่นนี้พวกเขาจำเป็นต้องชี้ไปที่ / route / abc / foo เพื่อให้คำขอดิบเข้ามาอย่างถูกต้อง คุณอาจจะดีกว่าปล่อยให้การกำหนดค่า nginx เหมือนเดิมและแทนที่จะกำหนดค่าแอพของคุณเพื่อให้ทราบว่ามันใช้งานได้ในไดเรกทอรีย่อยหากคุณทำได้

ฉันรู้ว่านี่เป็นคำถามเก่า แต่เป็น google hit อันดับต้น ๆ สำหรับฉันเมื่อฉันพยายามแก้ไขปัญหาเดียวกัน!


ขอบคุณมาก! ในลิงค์นี้เราสามารถตรวจสอบรายการตัวแปร: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal

17

ลองทำสิ่งต่อไปนี้

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

วิธีนี้ใช้ได้ผลดีที่สุดสำหรับฉันเพราะมันรักษาชื่อโฮสต์ไว้
Shafique Jamal

สะอาดและเรียบง่าย
Ravshan Samandarov

7

เป็นกลุ่ม nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

รหัสนี้ฟังบน 8080 และเปลี่ยนเส้นทางไปยังพอร์ต 8787 บน compute-1-36 คุณสามารถเลือกเส้นทางอื่นในตำแหน่ง /

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