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_header
hoạ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_header
hoạ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.
Secure
và gắn HttpOnly
cờ trên cookie phản hồi không? Tuy nhiên, cookie phản hồi mục tiêu chỉ có cookie name
và expire
thuộc tính.
add_header
hoạt động tốt proxy_pass
khi 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.5
bạ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 đè server
giá trị tiêu đề bằng cách sử dụng add_header
.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
vs 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_header
chỉ thị. Bạn không cần phải gửi chúng.
Như oliver viết:
add_header
hoạt động tốtproxy_pass
khi 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_header
xử lý lỗi, như sau:
add_header X-Upstream $upstream_addr always;
Thêm một tiêu đề với add_header
hoạ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-Origin
tiê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_header
kết hợp với add_header
cung 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 location
khối của bạn khi bạn sử dụng, proxy_pass
hã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"; } }