ฉันตั้ง Apache ไว้เป็น load balancer ฉันต้องการให้ apache ตั้งค่าส่วนหัว X-Forwarded-Proto แต่วิธีนี้ไม่ทำงาน:
RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"
ส่วนหัวได้รับการตั้งค่าเป็นโมฆะ มีความคิดอะไรบ้าง
ฉันตั้ง Apache ไว้เป็น load balancer ฉันต้องการให้ apache ตั้งค่าส่วนหัว X-Forwarded-Proto แต่วิธีนี้ไม่ทำงาน:
RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"
ส่วนหัวได้รับการตั้งค่าเป็นโมฆะ มีความคิดอะไรบ้าง
คำตอบ:
ช้า แต่ก็ยังเพิ่งเจอกับปัญหาเดียวกันและมันก็ใช้ได้กับฉัน:
RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS
เอกสารพูดว่า:
เมื่อใช้คำสั่ง RequestHeader กับการเพิ่มผนวกหรือตั้งค่าอาร์กิวเมนต์อาจมีการใช้อาร์กิวเมนต์ที่สี่เพื่อระบุเงื่อนไขภายใต้การดำเนินการ หากตัวแปรสภาพแวดล้อมที่ระบุในอาร์กิวเมนต์ env = ... มีอยู่ (หรือหากตัวแปรสภาพแวดล้อมไม่มีอยู่และระบุ env =! ... ) การกระทำที่ระบุโดยคำสั่ง RequestHeader จะมีผล มิฉะนั้นคำสั่งจะไม่มีผลกับการร้องขอ
ในขณะที่ตัวแปรสภาพแวดล้อม HTTPS ถูกตั้งค่าเฉพาะเมื่อมีการร้องขอผ่าน SSL
คุณไม่ต้องการที่; มันจะตั้งค่าส่วนหัวของคุณเป็น "HTTP / 1.1" (แม้ในคำขอ https) - อาจไม่เป็นประโยชน์อย่างมากกับสิ่งที่คุณส่งผ่าน
คุณมีบล็อก VirtualHost ที่แตกต่างกันสำหรับ http และ https; เพียง hardcode การRequestHeader
ตั้งค่าในแต่ละ
<VirtualHost *:80>
RequestHeader set X-Forwarded-Proto "http"
...
</VirtualHost>
<VirtualHost *:443>
RequestHeader set X-Forwarded-Proto "https"
...
</VirtualHost>
คุณสามารถแก้ไขได้โดยใช้early
คำหลัก:
RequestHeader set X-Forwarded-Proto "https" early
มิฉะนั้นคุณสามารถทำสิ่งที่ John Crenshaw แนะนำซึ่งใช้RewriteRule
แทนProxyPass
คำสั่ง
พบสาเหตุ ปรากฎว่ามันเป็นคำสั่งของปัญหาการดำเนินงาน mod_rewrite มีหน้าที่จัดหาตัวแปรสภาพแวดล้อมเหล่านี้ แต่ Apache จะไม่ประมวลผลจนกว่าจะได้รับการร้องขอ ProxyPass จนกว่าจะถึงตอนนั้นก็จะตั้งค่าเป็นโมฆะ วิธีแก้ปัญหาเฉพาะดูเหมือนว่าจะทำพร็อกซี่ผ่าน mod_rewrite
ดูhttp://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160