Chcę dodać niestandardowy nagłówek do odpowiedzi otrzymanej z serwera za nginx.
Chociaż add_header
działa w przypadku odpowiedzi przetwarzanych przez nginx, nic nie robi, gdy proxy_pass
jest używany.
Chcę dodać niestandardowy nagłówek do odpowiedzi otrzymanej z serwera za nginx.
Chociaż add_header
działa w przypadku odpowiedzi przetwarzanych przez nginx, nic nie robi, gdy proxy_pass
jest 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.
Secure
i HttpOnly
oznaczać pliki cookie odpowiedzi ? Jednak docelowy plik cookie odpowiedzi ma tylko plik cookie name
i expire
atrybuty.
add_header
działa równie dobrze proxy_pass
jak 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.5
możesz użyć słowa kluczowego, always
aby 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ć server
wartości nagłówka za pomocą add_header
.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5 prawdopodobnie nie jest pomocny w maskowaniu infrastruktury, ale przekazuje ideę).
add_header
dyrektywy. W ogóle nie musisz ich wysyłać.
Jak pisze Oliver:
add_header
działa równie dobrzeproxy_pass
jak bez.
Jednak, jak pisze Shane, od wersji Nginx 1.7.5 musisz przejść always
, aby rozpocząć add_header
pracę 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-Origin
nagłó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_header
połączeniu z add_header
daje 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 location
bloku, kiedy używasz, proxy_pass
zró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"; } }