วิธีการให้ nginx ส่งต่อส่วนหัว HTTP_X_FORWARDED_PROTO


18

ฉันปิดกั้นการตั้งค่าของฉันจาก

nginx > apache/php

ถึง

haproxy > nginx > apache/php

(ใช้ haproxy 1.5-dev18 พร้อมการรองรับ ssl)

ทั้ง nginx และ haproxy มีการตั้งค่าอย่างถูกต้องเพื่อตั้งค่าส่วนหัว HTTP_X_FORWARDED_PROTO อย่างไรก็ตามเมื่อ nginx รับการรับส่งข้อมูล ssl จาก haproxy จะเห็นการเชื่อมต่อเป็น http และตั้งค่าส่วนหัวเป็นเช่นนั้น

ฉันจะตั้งค่า nginx ให้ส่งต่อส่วนหัว HTTP_X_FORWARDED_PROTO ได้อย่างไรถ้ามีอยู่ แต่ถ้าไม่เช่นนั้นให้ทำการตั้งค่าตามการเชื่อมต่อต่อไป

คำตอบ:


36

ฉันหาวิธีแก้ปัญหานี้ ปัญหาคือว่า nginx เขียนทับส่วนหัวที่กำหนดโดย haproxy ในบรรทัดการตั้งค่าของฉันนี้:

proxy_set_header X-Forwarded-Proto $scheme;

ฉันแก้ไขได้โดยการเพิ่มในนี้:

map $http_x_forwarded_proto $thescheme {
     default $scheme;
     https https;
 }   

และการเปลี่ยนบรรทัด proxy_set_header เพื่อใช้รูปแบบใหม่:

proxy_set_header X-Forwarded-Proto $thescheme;

ถ้าฉันไม่มีบางอย่างอยู่ก่อนและหลังproxy_set_headerบรรทัดจะเหมือนกัน
Wilfred Hughes

1
$scheme$theschemeVS
Arlen Beiler

นี่ไม่ใช่ในบางกรณีที่ไม่ปลอดภัยหรือไม่ หากเว็บเบราว์เซอร์ส่งคำขอ HTTP ไปที่ haproxy และจากนั้น haproxy จะส่งคำขอ HTTPS ไปที่ Nginx - default $schemeกรณีนั้นจะเกิดขึ้นการตั้งค่า$theschemeเป็น HTTPS แม้ว่าในความเป็นจริงคำขอ (เป็น haproxy) นั้นไม่ปลอดภัย HTTP - เพื่อหลีกเลี่ยงสิ่งนั้นสิ่งที่เกี่ยวกับ: default $http_x_forwarded_proto; '' $scheme;ดังนั้นหาก haproxy กล่าวว่า HTTP มันจะได้รับการเคารพ
KajMagnus

แนะนำว่านี่: stackoverflow.com/a/21911864/694469 (เช่นdefault $http_x_forwarded_proto;)
KajMagnus

2

ฉันต้องการสิ่งเดียวกันกับ AWS ELB

นี่คือสายการแก้ปัญหาของฉัน:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

ฉันควรวางเดิมพัน$http_x_forwarded_protoที่ไหน? นั่นคืออะไร?
Jonathan

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto คือการนำไปใช้ของ
NGINX

2
คุณตอบแค่แก้ปัญหาที่ฉันใช้ไปเป็นเวลา 3 วัน! ทุกโพสต์อื่น ๆ ในเรื่องของ aws load balancer ที่มี https advocate proxy_set_header X-Forwarded-Proto $scheme;ซึ่งใช้งานไม่ได้
MikeMarsian

1

ฉันไม่สามารถแสดงความคิดเห็นได้ดังนั้นฉันโพสต์สิ่งนี้เป็นคำตอบ: คุณช่วยให้เรากำหนดค่า nginx บางส่วนหรือทั้งหมดของคุณเพื่อให้เราเห็นว่ามีอะไรผิดปกติหรือไม่? เป็นไปได้ว่าการกำหนดค่า HAProxy ของคุณด้วยหรือไม่

ปัญหาแรกที่ฉันคิดได้ก็คือ HAProxy ของคุณกำลังทำการยกเลิก ssl เพื่อสรุปผลการถ่ายเซิร์ฟเวอร์แบ็กเอนด์ของคุณคุณสามารถกำหนดค่า load balancer เพื่อทำทุกอย่างของ ssl จากนั้นสื่อสารกับเซิร์ฟเวอร์ backend ของคุณใน HTTP ชอบรูปแบบที่นี่: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

เพื่อให้คำตอบที่ดีสำหรับคำถามของคุณคุณสามารถตรวจสอบว่าคุณไม่มีปัญหาลูปแบ็คใน http <> https config หรือไม่ บางทีคุณอาจเปลี่ยนเส้นทาง http เป็น http, https เป็น https แล้วบังคับให้ http เปลี่ยนเส้นทางไปยัง https

คุณสามารถตรวจสอบด้วยว่าคุณได้เปิดใช้งาน ssl passthrough ในการกำหนดค่า HAProxy ของคุณหรือไม่


คุณแก้ไขปัญหาของคุณหรือไม่
Yannovitch

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