Làm cách nào để nginx chuyển tiếp tiêu đề HTTP_X_FORWARDED_PROTO?


18

Tôi đang thiết lập thiết lập của mình từ

nginx > apache/php

đến

haproxy > nginx > apache/php

(sử dụng haproxy 1.5-dev18 với hỗ trợ ssl được biên dịch)

Cả nginx và haproxy đều được thiết lập chính xác để đặt tiêu đề HTTP_X_FORWARDED_PROTO. Tuy nhiên, khi nginx nhận được lưu lượng ssl từ haproxy, nó sẽ thấy kết nối là http và đặt tiêu đề như vậy.

Làm cách nào tôi có thể đặt nginx để chuyển tiếp tiêu đề HTTP_X_FORWARDED_PROTO nếu nó tồn tại, nhưng nếu không thì tiếp tục cài đặt nó dựa trên kết nối?

Câu trả lời:


36

Tôi đã tìm ra cách để giải quyết điều này. Vấn đề là nginx đã ghi đè lên tiêu đề được đặt bởi haproxy trên dòng cấu hình này của tôi:

proxy_set_header X-Forwarded-Proto $scheme;

Tôi đã sửa nó bằng cách thêm vào đây:

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

và thay đổi dòng proxy_set_header để sử dụng lược đồ mới:

proxy_set_header X-Forwarded-Proto $thescheme;

Trừ khi tôi thiếu một cái gì đó, các proxy_set_headerdòng trước và sau của bạn đều giống nhau.
Wilfred Hughes

1
$schemevs $thescheme.
Arlen Beiler

Đây không phải là trong một số trường hợp hiếm hoi không an toàn? Nếu trình duyệt web gửi yêu cầu HTTP đến haproxy và haproxy sau đó gửi yêu cầu HTTPS đến Nginx - thì default $schemetrường hợp đó sẽ xảy ra, cài đặt $theschemethành HTTPS mặc dù trên thực tế, yêu cầu (đối với haproxy) không an toàn HTTP. - Để tránh điều đó, còn về default $http_x_forwarded_proto; '' $scheme;:, vì vậy nếu haproxy nói HTTP thì nó sẽ được tôn trọng.
KajMagnus

Điều đó được đề xuất ở đây: stackoverflow.com/a/21911864/694469 (tức là default $http_x_forwarded_proto;).
KajMagnus

2

Tôi có cùng nhu cầu với AWS ELB

Đây là dòng giải quyết của tôi:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

Tôi có nên đặt cược $http_x_forwarded_protoở đâu đó không? Đó là gì?
Jonathan

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ trộm $ http_x_forwarded_proto là triển khai
NGINX

2
Bạn trả lời vừa giải quyết một vấn đề tôi đã mắc kẹt trong 3 ngày! Mọi bài đăng khác về chủ đề cân bằng tải aws với người ủng hộ https proxy_set_header X-Forwarded-Proto $scheme;, không hoạt động
MikeMarsian

1

Tôi không thể chỉ nhận xét vì vậy tôi đăng bài này dưới dạng câu trả lời: Bạn có thể cung cấp cho chúng tôi một phần hoặc toàn bộ cấu hình nginx của bạn để chúng tôi có thể thấy điều gì sai với nó không? Có thể cấu hình HAProxy của bạn quá?

Vấn đề đầu tiên tôi có thể nghĩ đến là HAProxy của bạn đang thực hiện chấm dứt ssl. Để tổng hợp, để giảm tải cho các máy chủ phụ trợ của bạn, một bộ cân bằng tải có thể được cấu hình để thực hiện tất cả các điều ssl, sau đó liên lạc với các máy chủ phụ trợ của bạn trong HTTP. Giống như chương trình ở đây: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Để cung cấp cho bạn câu trả lời hay cho câu hỏi của bạn, bạn có thể kiểm tra xem bạn không có bất kỳ vấn đề lặp lại nào trong cấu hình http <> https của bạn không? Có lẽ sau đó bạn có thể chuyển hướng http sang http, https sang https và sau đó buộc http được chuyển hướng sang https.

Bạn có thể kiểm tra xem bạn đã kích hoạt ssl passthrough trong cấu hình HAProxy của bạn không?


Bạn đã giải quyết vấn đề của bạn?
Yannovitch

1
Tôi đã hiểu rồi. Câu trả lời của bạn không giúp ích trực tiếp, nhưng liên kết thứ hai đó đã giúp tôi tìm ra cách giải quyết nó. Cảm ơn.
Echo nói phục hồi Monica
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.