Người yêu cầu với biến môi trường Apache


13

Tôi đã thiết lập Apache như một bộ cân bằng tải. Tôi muốn làm cho apache đặt tiêu đề X-Forwarded-Proto, nhưng điều này không hoạt động:

RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"

Tiêu đề được đặt thành null. Bất cứ ý tưởng tại sao?

Câu trả lời:


15

Tuy muộn nhưng tôi vẫn xử lý vấn đề tương tự và điều này hiệu quả với tôi:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

Các tài liệu nói:

Khi chỉ thị RequestHeader được sử dụng với đối số add, append hoặc set, một đối số thứ tư có thể được sử dụng để chỉ định các điều kiện theo đó hành động sẽ được thực hiện. Nếu biến môi trường được chỉ định trong đối số env = ... tồn tại (hoặc nếu biến môi trường không tồn tại và env =! ... được chỉ định) thì hành động được chỉ định bởi chỉ thị RequestHeader sẽ có hiệu lực. Nếu không, chỉ thị sẽ không có hiệu lực đối với yêu cầu.

Trong khi biến môi trường HTTPS chỉ được đặt khi yêu cầu được thực hiện thông qua SSL.


3
Theo en.wikipedia.org/wiki/List_of_HTTP_header_fields tiêu đề nên có dấu gạch nối thay vì dấu gạch dưới: RequestHeader đặt X-Forwarded-Proto 'https' env = HTTPS Đây cũng là tiêu đề mà ELB của Amazon gửi.
loevborg

9

Bạn không muốn điều đó; nó sẽ đặt tiêu đề của bạn thành "HTTP / 1.1" (ngay cả trên yêu cầu https) - có thể không hữu ích lắm cho bất cứ điều gì bạn chuyển đến.

Bạn có các khối Virtualhost khác nhau cho http và https; chỉ cần mã hóa các RequestHeaderthiết lập trong mỗi.

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"
    ...
</VirtualHost>

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>

1
Điều này vẫn không trả lời câu hỏi tại sao các biến môi trường không hoạt động. Tôi cũng muốn bảo tồn cổng và một số giá trị khác, một số trong đó không thể được mã hóa cứng như thế này.
John Crenshaw

3

Bạn có thể khắc phục điều này bằng cách sử dụng earlytừ khóa:

RequestHeader set X-Forwarded-Proto "https" early

Mặt khác, bạn có thể làm những gì John Crenshaw đề xuất, đó là sử dụng RewriteRulethay vì ProxyPasschỉ thị.


1
Làm thế nào tôi có thể gỡ lỗi cho dù apache thực sự đang gửi tiêu đề này?
codecowboy

2

Tìm ra nguyên nhân. Hóa ra nó là một thứ tự của vấn đề hoạt động. mod_rewrite chịu trách nhiệm cung cấp các biến môi trường này, nhưng Apache không xử lý nó cho đến khi SAU nó xử lý bất kỳ yêu cầu ProxyPass nào. Cho đến lúc đó, nó sẽ chỉ đặt null. Cách giải quyết duy nhất có vẻ là thực hiện ủy quyền thông qua mod_rewrite.

Xem http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.