Nginx reverse proxy redirection


14

ฉันกำลังใช้nginxเป็นพร็อกซีย้อนกลับและเมื่อฉันเข้าสู่ระบบในเว็บอินเตอร์เฟสของฉันฉันถูกเปลี่ยนเส้นทางไปยัง URL พร็อกซี ฉันต้องการหลีกเลี่ยงและเก็บ "server_name" ไว้เป็น URL เสมอ เป็นไปได้ไหม?

นี่คือของฉัน/etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

ฉันเชื่อมต่อhttp://my-app.netใส่ข้อมูลการเข้าสู่ระบบจากนั้นฉันถูกเปลี่ยนเส้นทางไปhttp://ip_of_the_app:7180ที่หน้าเข้าสู่ระบบเดียวกันและฉันต้องลงชื่อเข้าใช้อีกครั้ง สามารถหลีกเลี่ยงการเข้าสู่ระบบสองครั้งนี้ได้หรือไม่


tonio94 ปัญหาของคุณได้รับการแก้ไขแล้วหรือยัง? ถ้าใช่โปรดยอมรับคำตอบ ถ้าไม่ได้โปรดอธิบายสิ่งที่ขาดหายไป
cnst

2
ฉันเพิ่งทดสอบเมื่อวานนี้มันใช้งานได้ proxy_redirect ต้องถูกลบออก ขอบคุณสำหรับความช่วยเหลือ
tonio94

คำตอบ:


27

ไม่ได้ตั้งค่าproxy_redirectไปoffที่ไม่ได้ทำในสิ่งที่คุณคิดว่ามันจะทำ proxy_redirectดำเนินการคล้ายกับการเขียน URL ใหม่เช่น:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

สิ่งนี้ช่วยให้คุณสามารถโฮสต์/sales/เส้นทางที่อื่น แต่ถึงอย่างนั้นพารามิเตอร์เริ่มต้นสำหรับproxy_redirectทำเช่นนั้นให้คุณฟรี ค่าเริ่มต้นคือการเปลี่ยนเส้นทางตำแหน่งไปยังสิ่งที่มีอยู่ในproxy_pass(และพารามิเตอร์เริ่มต้นจะใช้เมื่อคุณไม่ได้ตั้งค่าproxy_redirectทั้งหมดหรือใช้proxy_redirect default;)

proxy_redirectคุณไม่จำเป็นต้องตั้งค่า


สิ่งที่คุณพลาดคือส่วนหัวที่ต้องส่งไปยังแอป HOSTส่วนใหญ่ที่สำคัญของพวกเขาคือ สิ่งนี้จะดำเนินการมอบฉันทะตามที่ต้องการและจะต้องเก็บ URL ที่ถูกต้องในเบราว์เซอร์

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

โปรดทราบว่าแอปที่http://ip_of_the_app:7180/จะได้รับคำขอพร้อมHost: my-app.netส่วนหัว


คุณควรพิจารณาใช้ส่วนหัวอีกสองสามรายการ:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

ซึ่งจะช่วยให้การเข้าสู่ระบบที่ดีขึ้นภายใน app http://ip_of_the_app:7180/ที่ X-Forwarded-Forให้ IP ของลูกค้าจริง (ตรงข้ามกับnginxIP) และX-Forwarded-Protoเพื่อตรวจสอบว่าลูกค้าเชื่อมต่อกับnginxผ่าน HTTP หรือ HTTPS


ขอบคุณสำหรับความช่วยเหลือของคุณ. ไม่จำเป็นต้องใช้ proxy_redirect แต่จะต้องตั้งค่าproxy_set_header Referer ip_of_the_app: 7180เพื่อให้ทำงานได้อย่างถูกต้อง
tonio94

@ tonio94 - ขอบคุณฉันอัปเดตคำตอบ โปรดทราบว่าการใช้งานปกติของเครื่องRefererนั้น$http_refererเป็นการคัดลอกจากคำขอ ไม่สามารถใช้งานได้หากคำขอไม่มีส่วนหัว Referer ดังนั้นการเข้ารหัส hardcoding จึงเป็นวิธีแก้ปัญหาในบางกรณี
grochmal

@JonathanKomar - ขอบคุณสำหรับสิ่งที่คุณถูกต้องตอนนี้แก้ไข ขออภัยฉันใช้เวลาสักครู่ก่อนที่จะสังเกตเห็นความคิดเห็นของคุณ
grochmal

@ grochmal ขอบคุณโดยทั่วไปคุณช่วยชีวิตฉันด้วยข้อมูลนี้เกี่ยวกับ: proxy_set_header HOST $ host;
Obay Abd-Algader
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.