Подтвердить что ты не робот

Как добавить заголовок ответа на nginx при использовании proxy_pass?

Я хочу добавить пользовательский заголовок для ответа, полученного от сервера за nginx.

Пока add_header работает для обработанных nginx-ответов, он ничего не делает, когда используется proxy_pass.

4b9b3361

Ответ 1

Существует модуль под названием HttpHeadersMoreModule, который дает вам больше контроля над заголовками. Он не поставляется с Nginx и требует дополнительной установки. С его помощью вы можете сделать что-то вроде этого:

location ... {
  more_set_headers "Server: my_server";
}

Это будет "устанавливать заголовок вывода сервера для пользовательского значения для любого кода состояния и любого типа содержимого". Он заменит заголовки, которые уже установлены, или добавьте их, если они не установлены.

Ответ 2

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.

Ответ 3

Как пишет oliver:

add_header работает также с proxy_pass как без.

Однако, как пишет Шейн, с Nginx 1.7.5 вы должны пройти always, чтобы получить add_header для работы с ответами об ошибке:

add_header  X-Upstream  $upstream_addr always;

Ответ 4

Вы можете попробовать это решение:

В вашем блоке 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;

Ответ 5

Скрыть заголовок ответа, а затем добавить новое настраиваемое значение заголовка

Добавление заголовка с 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

UPDATE:

Примечание: proxy_set_header предназначен для установки заголовков запроса перед дальнейшей отправкой запроса, а не для настройки заголовков ответа (эти атрибуты конфигурации для заголовков могут быть немного запутанными).