Я хочу добавить пользовательский заголовок для ответа, полученного от сервера за nginx.
Пока add_header
работает для обработанных nginx-ответов, он ничего не делает, когда используется proxy_pass
.
Я хочу добавить пользовательский заголовок для ответа, полученного от сервера за nginx.
Пока add_header
работает для обработанных nginx-ответов, он ничего не делает, когда используется proxy_pass
.
Существует модуль под названием 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
.
Как пишет oliver:
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;
Добавление заголовка с 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
предназначен для установки заголовков запроса перед дальнейшей отправкой запроса, а не для настройки заголовков ответа (эти атрибуты конфигурации для заголовков могут быть немного запутанными).