Как добавить заголовок ответа на nginx при использовании proxy pass?
Я хочу добавить пользовательский заголовок для ответа, полученного от сервера за nginx.
пока add_header
работает для nginx-обработанных ответов, он ничего не делает, когда есть.
4 ответов
есть модуль под названием HttpHeadersMoreModule что дает вам больше контроля над заголовками. Он не поставляется с Nginx и требует дополнительной установки. С его помощью вы можете сделать что-то вроде этого:
location ... {
more_set_headers "Server: my_server";
}
это "установит заголовок вывода сервера в пользовательское значение для любого кода состояния и любого типа контента". Он заменит заголовки, которые уже установлены, или добавит их, если они не установлены.
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
работает сproxy_pass
как без.
однако, как пишет Шейн, начиная с Nginx 1.7.5, вы должны пройти always
для получения add_header
для работы с ответами на ошибки, например:
add_header X-Upstream $upstream_addr always;
вы можете попробовать это решение:
в своем 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;