Как добавить заголовок ответа на 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;