Як додати заголовок відповіді на nginx при використанні proxy_pass?


92

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

Хоча add_headerпрацює для відповідей, оброблених nginx, він нічого не робить, коли proxy_passвикористовується.


Отже, ви передаєте запит проксі-серверу та відповіді цього проксі-сервера, і на цю відповідь ви хочете додати свій власний заголовок, перш ніж він буде відправлений користувачеві, це правильно?
emka86

Відповіді:


31

Існує модуль HttpHeadersMoreModule, який надає вам більше контролю над заголовками. Він не постачається з Nginx і вимагає додаткового встановлення. З його допомогою ви можете зробити щось подібне:

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

Це "встановить для заголовка виводу сервера спеціальне значення для будь-якого коду стану та будь-якого типу вмісту". Він замінить вже встановлені заголовки або додасть їх, якщо не встановлено.


чи можна додати Secureта HttpOnlyпозначити файли cookie відповіді ? Кукі цільового відповіді тільки є печиво nameі expireатрибути , хоча.
JPaulPunzalan

2
Вам не обов’язково потрібна бібліотека, щоб мати змогу змінювати або додавати заголовки відповідей, і, на відміну від найбільш голосованої відповіді, ви можете замінити заголовок, просто його потрібно спочатку видалити. Перевірте мою відповідь нижче для деталей.
Вілт

162

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.


41
Починаючи з nginx 1.7.5, ви можете використовувати "завжди", щоб включати власні заголовки у відповіді на помилки, використовуючи add_header:add_header X-Upstream $upstream_addr always;
Шейн

У будь-якому випадку мати подібну функціональність без викриття комбінації IP / порт проксі-сервера? наприклад X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5, мабуть, не корисний у маскуванні інфраструктури, але він передає ідею).
zamnuts

@zamnuts: Передача вихідних номерів IP та портів є лише прикладом використання add_headerдирективи. Вам не потрібно надсилати їх взагалі.
Олівер

@Oliver, я це знаю, але я запитував про альтернативний індивідуальний / унікальний ідентифікатор висхідного потоку, відмінний від номерів IP / портів, або його затухання. Можливо, моє запитання вийшло за рамки, і мені слід створити новий допис :)
zamnuts

@zamnuts: Я б також запропонував задати нове запитання :-)
Олівер,

25

Як пише Олівер:

add_headerпрацює як з, proxy_passтак і без.

Однак, як пише Шейн, станом на Nginx 1.7.5, ви повинні пройти always, щоб почати add_headerпрацювати з відповідями на помилки, наприклад:

add_header  X-Upstream  $upstream_addr always;

5
Я довго дивувався, чому мої заголовки не відображаються, намагаючись перемістити їх у блоці сервера, блоці розташування, ... і тут була причина: nginx не додає їх у відповіді на помилки: F Дякую
Shautieh

Я теж :) і, незважаючи на цю відповідь, це просто сталося зі мною днями знову. Довелося переглянути власну відповідь.
Дмитро Міньковський


15

Сховати заголовок відповіді, а потім додати нове власне значення заголовка

Додавання заголовка з 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 призначений для встановлення заголовків запитів перед подальшим надсиланням запиту, а не для встановлення заголовків відповідей (ці атрибути конфігурації заголовків можуть трохи заплутати).


Дякую, велика допомога
Лансер. Ян

14

Ви можете спробувати це рішення:

У вашому 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;

6
Мені довелося використовувати цей метод, оскільки nginx додавав дублікат заголовка, а не перезаписував вихідний. 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"; } }
ether6
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.