Я хочу додати власний заголовок для відповіді, отриманої від сервера позаду nginx.
Хоча add_header
працює для відповідей, оброблених nginx, він нічого не робить, коли proxy_pass
використовується.
Я хочу додати власний заголовок для відповіді, отриманої від сервера позаду nginx.
Хоча add_header
працює для відповідей, оброблених nginx, він нічого не робить, коли proxy_pass
використовується.
Відповіді:
Існує модуль HttpHeadersMoreModule, який надає вам більше контролю над заголовками. Він не постачається з Nginx і вимагає додаткового встановлення. З його допомогою ви можете зробити щось подібне:
location ... {
more_set_headers "Server: my_server";
}
Це "встановить для заголовка виводу сервера спеціальне значення для будь-якого коду стану та будь-якого типу вмісту". Він замінить вже встановлені заголовки або додасть їх, якщо не встановлено.
Secure
та HttpOnly
позначити файли cookie відповіді ? Кукі цільового відповіді тільки є печиво name
і expire
атрибути , хоча.
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 X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5, мабуть, не корисний у маскуванні інфраструктури, але він передає ідею).
add_header
директиви. Вам не потрібно надсилати їх взагалі.
Як пише Олівер:
add_header
працює як з,proxy_pass
так і без.
Однак, як пише Шейн, станом на Nginx 1.7.5, ви повинні пройти always
, щоб почати add_header
працювати з відповідями на помилки, наприклад:
add_header X-Upstream $upstream_addr always;
Додавання заголовка з 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
призначений для встановлення заголовків запитів перед подальшим надсиланням запиту, а не для встановлення заголовків відповідей (ці атрибути конфігурації заголовків можуть трохи заплутати).
Ви можете спробувати це рішення:
У вашому 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;
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"; } }