Tôi muốn thêm tiêu đề tùy chỉnh cho phản hồi nhận được từ máy chủ phía sau nginx.
Mặc dù add_headerhoạt động đối với các phản hồi được xử lý bằng nginx, nhưng nó không có tác dụng gì khi proxy_passđược sử dụng.
Tôi muốn thêm tiêu đề tùy chỉnh cho phản hồi nhận được từ máy chủ phía sau nginx.
Mặc dù add_headerhoạt động đối với các phản hồi được xử lý bằng nginx, nhưng nó không có tác dụng gì khi proxy_passđược sử dụng.
Câu trả lời:
Có một mô-đun được gọi là HttpHeadersMoreModule cho phép bạn kiểm soát nhiều hơn các tiêu đề. Nó không đi kèm với Nginx và yêu cầu cài đặt thêm. Với nó, bạn có thể làm điều gì đó như sau:
location ... {
more_set_headers "Server: my_server";
}
Điều đó sẽ "đặt tiêu đề đầu ra của Máy chủ thành giá trị tùy chỉnh cho bất kỳ mã trạng thái nào và bất kỳ loại nội dung nào". Nó sẽ thay thế các tiêu đề đã được đặt hoặc thêm chúng nếu không được đặt.
Securevà gắn HttpOnlycờ trên cookie phản hồi không? Tuy nhiên, cookie phản hồi mục tiêu chỉ có cookie namevà expirethuộc tính.
add_headerhoạt động tốt proxy_passkhi không có. Hôm nay tôi vừa thiết lập một cấu hình mà tôi đã sử dụng chính xác chỉ thị đó. Mặc dù vậy, tôi phải thừa nhận rằng tôi đã rất vất vả khi thiết lập điều này mà không nhớ lại chính xác lý do.
Ngay bây giờ tôi có một cấu hình đang hoạt động và nó chứa những thứ sau (trong số những cấu hình khác):
server {
server_name .myserver.com
location / {
proxy_pass http://mybackend;
add_header X-Upstream $upstream_addr;
}
}
Trước khi nginx 1.7.5 add_header chỉ hoạt động trên các phản hồi thành công, trái ngược với HttpHeadersMoreModule được Sebastian Goodman đề cập trong câu trả lời của mình .
Vì nginx, 1.7.5bạn có thể sử dụng từ khóa alwaysđể bao gồm các tiêu đề tùy chỉnh ngay cả trong các phản hồi lỗi. Ví dụ:
add_header X-Upstream $upstream_addr always;
Giới hạn: Bạn không thể ghi đè servergiá trị tiêu đề bằng cách sử dụng add_header.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 có lẽ không hữu ích trong việc che cơ sở hạ tầng, nhưng nó truyền đạt ý tưởng).
add_headerchỉ thị. Bạn không cần phải gửi chúng.
Như oliver viết:
add_headerhoạt động tốtproxy_passkhi không có.
Tuy nhiên, như Shane viết, kể từ Nginx 1.7.5, bạn phải vượt qua alwaysđể bắt đầu add_headerxử lý lỗi, như sau:
add_header X-Upstream $upstream_addr always;
Thêm một tiêu đề với add_headerhoạt động tốt với chuyển proxy, nhưng nếu có một giá trị tiêu đề hiện có trong phản hồi, nó sẽ xếp chồng các giá trị.
Nếu bạn muốn đặt hoặc thay thế giá trị tiêu đề (ví dụ: thay thế Access-Control-Allow-Origintiêu đề để phù hợp với ứng dụng khách của bạn để cho phép chia sẻ tài nguyên nguồn gốc chéo) thì bạn có thể thực hiện như sau:
# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;
Vì vậy, proxy_hide_headerkết hợp với add_headercung cấp cho bạn sức mạnh để đặt / thay thế các giá trị tiêu đề phản hồi.
Câu trả lời tương tự có thể được tìm thấy tại đây trên ServerFault
Lưu ý: proxy_set_header là để đặt tiêu đề yêu cầu trước khi yêu cầu được gửi thêm, không phải để đặt tiêu đề phản hồi (các thuộc tính cấu hình này cho tiêu đề có thể hơi khó hiểu).
Bạn có thể thử giải pháp này:
Trong locationkhối của bạn khi bạn sử dụng, proxy_passhãy làm như sau:
location ... {
add_header yourHeaderName yourValue;
proxy_pass xxxx://xxx_my_proxy_addr_xxx;
# Now use this solution:
proxy_ignore_headers yourHeaderName // but set by proxy
# Or if above didn't work maybe this:
proxy_hide_header yourHeaderName // but set by proxy
}
Tôi không chắc đó có phải là chính xác những gì bạn cần nhưng hãy thử một số thao tác của phương pháp này và có thể kết quả sẽ phù hợp với vấn đề của bạn.
Ngoài ra, bạn có thể sử dụng kết hợp này:
proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }