Я хочу добавить настраиваемый заголовок для ответа, полученного от сервера за nginx.
Хотя он add_header
работает для ответов, обработанных nginx, он ничего не делает при proxy_pass
использовании.
Я хочу добавить настраиваемый заголовок для ответа, полученного от сервера за nginx.
Хотя он add_header
работает для ответов, обработанных nginx, он ничего не делает при proxy_pass
использовании.
Ответы:
Существует модуль под названием HttpHeadersMoreModule, который дает вам больше контроля над заголовками. Он не поставляется с Nginx и требует дополнительной установки. С его помощью можно сделать что-то вроде этого:
location ... {
more_set_headers "Server: my_server";
}
Это «установит выходной заголовок сервера на пользовательское значение для любого кода состояния и любого типа контента». Он заменит уже установленные заголовки или добавит их, если они не установлены.
Secure
и HttpOnly
флаги в ответный cookie ? Однако целевой файл cookie ответа имеет только файл cookie name
и expire
атрибуты.
add_header
работает так же хорошо, proxy_pass
как и без. Я только что создал конфигурацию, в которой использовал именно эту директиву. Я должен признать, что я тоже боролся с настройкой этого, хотя точно не вспомнил причину.
Прямо сейчас у меня есть рабочая конфигурация, и она содержит (среди прочего) следующее:
server {
server_name .myserver.com
location / {
proxy_pass http://mybackend;
add_header X-Upstream $upstream_addr;
}
}
Раньше nginx 1.7.5
add_header работал только с успешными ответами, в отличие от HttpHeadersMoreModule, упомянутого Себастьяном Гудманом в его ответе .
Начиная с nginx, 1.7.5
вы можете использовать ключевое слово always
для включения пользовательских заголовков даже в ответы об ошибках. Например:
add_header X-Upstream $upstream_addr always;
Ограничение: вы не можете переопределить server
значение заголовка с помощью add_header
.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5, вероятно, бесполезен для маскировки инфраструктуры, но он передает идею).
add_header
директивы. Их совсем не нужно отправлять.
Как пишет Оливер:
add_header
работает так же хорошо,proxy_pass
как и без.
Однако, как пишет Шейн, начиная с Nginx 1.7.5, вы должны пройти always
, чтобы приступить add_header
к работе с сообщениями об ошибках, например:
add_header X-Upstream $upstream_addr always;
Добавление заголовка add_header
отлично работает с прокси-проходом, но если в ответе есть существующее значение заголовка, оно складывает значения.
Если вы хотите установить или заменить значение заголовка (например, заменить Access-Control-Allow-Origin
заголовок, чтобы он соответствовал вашему клиенту, чтобы разрешить совместное использование ресурсов из разных источников), вы можете сделать следующее:
# 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 *;
Таким образом, в proxy_hide_header
сочетании с add_header
дает вам возможность устанавливать / заменять значения заголовка ответа.
Подобный ответ можно найти здесь, на ServerFault
Примечание: proxy_set_header
предназначен для установки заголовков запроса перед дальнейшей отправкой запроса, а не для установки заголовков ответа (эти атрибуты конфигурации для заголовков могут немного сбивать с толку).
Вы можете попробовать это решение:
В вашем location
блоке, когда вы используете, proxy_pass
сделайте что-то вроде этого:
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
}
Я не уверен, что это именно то, что вам нужно, но попробуйте немного поработать с этим методом, и, возможно, результат будет соответствовать вашей проблеме.
Также вы можете использовать эту комбинацию:
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"; } }