Chcę dodać niestandardowy nagłówek do odpowiedzi otrzymanej z serwera za nginx.
Chociaż add_headerdziała w przypadku odpowiedzi przetwarzanych przez nginx, nic nie robi, gdy proxy_passjest używany.
Chcę dodać niestandardowy nagłówek do odpowiedzi otrzymanej z serwera za nginx.
Chociaż add_headerdziała w przypadku odpowiedzi przetwarzanych przez nginx, nic nie robi, gdy proxy_passjest używany.
Odpowiedzi:
Istnieje moduł o nazwie HttpHeadersMoreModule, który zapewnia większą kontrolę nad nagłówkami. Nie jest dostarczany z Nginx i wymaga dodatkowej instalacji. Dzięki niemu możesz zrobić coś takiego:
location ... {
more_set_headers "Server: my_server";
}
Spowoduje to „ustawienie nagłówka wyjściowego serwera na niestandardową wartość dla dowolnego kodu stanu i dowolnego typu zawartości”. Zastąpi nagłówki, które są już ustawione, lub doda je, jeśli nie są ustawione.
Securei HttpOnlyoznaczać pliki cookie odpowiedzi ? Jednak docelowy plik cookie odpowiedzi ma tylko plik cookie namei expireatrybuty.
add_headerdziała równie dobrze proxy_passjak bez. Właśnie dzisiaj ustawiłem konfigurację, w której użyłem dokładnie tej dyrektywy. Muszę jednak przyznać, że również walczyłem z konfiguracją tego, nie pamiętając dokładnie powodu.
W tej chwili mam działającą konfigurację i zawiera ona (między innymi):
server {
server_name .myserver.com
location / {
proxy_pass http://mybackend;
add_header X-Upstream $upstream_addr;
}
}
Przed nginx 1.7.5 add_header pracował tylko nad udanymi odpowiedziami, w przeciwieństwie do HttpHeadersMoreModule, o którym wspomniał Sebastian Goodman w swojej odpowiedzi .
Od nginx 1.7.5możesz użyć słowa kluczowego, alwaysaby dołączyć niestandardowe nagłówki nawet w odpowiedziach na błędy. Na przykład:
add_header X-Upstream $upstream_addr always;
Ograniczenie: nie można zastąpić serverwartości nagłówka za pomocą add_header.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 prawdopodobnie nie jest pomocny w maskowaniu infrastruktury, ale przekazuje ideę).
add_headerdyrektywy. W ogóle nie musisz ich wysyłać.
Jak pisze Oliver:
add_headerdziała równie dobrzeproxy_passjak bez.
Jednak, jak pisze Shane, od wersji Nginx 1.7.5 musisz przejść always, aby rozpocząć add_headerpracę nad odpowiedziami na błędy, na przykład:
add_header X-Upstream $upstream_addr always;
Dodanie nagłówka z add_header działa dobrze z przebiegiem proxy, ale jeśli w odpowiedzi istnieje wartość nagłówka, wartości zostaną ułożone w stos.
Jeśli chcesz ustawić lub zamienić wartość nagłówka (na przykład zamienić Access-Control-Allow-Originnagłówek, aby pasował do klienta, aby umożliwić współdzielenie zasobów między źródłami), możesz wykonać następujące czynności:
# 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 *;
W proxy_hide_headerpołączeniu z add_headerdaje możliwość ustawiania / zastępowania wartości nagłówka odpowiedzi.
Podobną odpowiedź można znaleźć tutaj na ServerFault
Uwaga: proxy_set_header służy do ustawiania nagłówków żądań przed dalszym wysłaniem żądania, a nie do ustawiania nagłówków odpowiedzi (te atrybuty konfiguracji dla nagłówków mogą być nieco mylące).
Możesz wypróbować to rozwiązanie:
W swoim locationbloku, kiedy używasz, proxy_passzrób coś takiego:
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
}
Nie jestem pewien, czy to jest dokładnie to, czego potrzebujesz, ale spróbuj manipulacji tą metodą, a może wynik będzie pasował do Twojego problemu.
Możesz również użyć tej kombinacji:
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"; } }