Làm cách nào để thêm tiêu đề phản hồi trên nginx khi sử dụng proxy_pass?


92

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.


Vì vậy, bạn chuyển yêu cầu đến proxy và phản hồi bộ proxy đó và trên phản hồi này, bạn muốn thêm tiêu đề tùy chỉnh của mình trước khi nó được gửi đến người dùng, điều đó có đúng không?
emka86,

Câu trả lời:


31

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.


có thể thêm 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 nameexpirethuộc tính.
JPaulPunzalan

2
Bạn không nhất thiết phải cần thư viện để có thể thay đổi hoặc thêm tiêu đề phản hồi và ngược lại với câu trả lời được nhiều người bình chọn nhất, bạn có thể ghi đè tiêu đề, bạn chỉ cần xóa tiêu đề đó trước. Kiểm tra câu trả lời của tôi bên dưới để biết chi tiết.
Héo

162

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.


41
Vì nginx 1.7.5, bạn có thể sử dụng "always" để bao gồm các tiêu đề tùy chỉnh trong phản hồi lỗi bằng add_header:add_header X-Upstream $upstream_addr always;
Shane

Dù sao để có chức năng tương tự w / o lộ kết hợp IP / cổng của máy chủ được ủy quyền? ví dụ: 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).
zamnuts

@zamnuts: Chuyển số cổng và IP ngược dòng chỉ là một ví dụ về việc sử dụng add_headerchỉ thị. Bạn không cần phải gửi chúng.
Oliver

@Oliver, tôi biết điều đó, nhưng tôi đang hỏi về số nhận dạng ngược dòng cá nhân / duy nhất thay thế ngoài số IP / cổng hoặc sự xáo trộn của chúng. Có lẽ câu hỏi của tôi là ra khỏi phạm vi và tôi nên tạo một bài viết mới :)
zamnuts

@zamnuts: Tôi cũng khuyên bạn nên đặt một câu hỏi mới :-)
Oliver

25

Như oliver viết:

add_headerhoạt động tốt proxy_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;

5
Tôi đã dành một thời gian dài để tự hỏi tại sao tiêu đề của tôi không hiển thị, cố gắng di chuyển chúng trong khối máy chủ, khối vị trí, ... và đây là lý do: nginx không thêm chúng vào phản hồi lỗi: F Cảm ơn
Shautieh

Tôi cũng vậy :) và mặc dù câu trả lời này, điều này lại xảy ra với tôi vào một ngày khác. Đã phải xem lại câu trả lời của riêng tôi.
Dmitry Minkovsky


15

Ẩn tiêu đề phản hồi và sau đó thêm giá trị tiêu đề tùy chỉnh mới

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

CẬP NHẬT:

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).


Cảm ơn, sự giúp đỡ tuyệt vời
Lancer. Ngày

14

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;

6
Tôi phải sử dụng phương pháp này vì nginx đang thêm một tiêu đề trùng lặp thay vì ghi đè tiêu đề đang thoát. 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"; } }
ether 6
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.