Jak dodać nagłówek odpowiedzi na Nginx podczas korzystania z proxy_pass?

92

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.

sorin
źródło
Więc przekazujesz żądanie do proxy i odpowiedź ustawioną przez proxy, a do tej odpowiedzi chciałbyś dodać swój niestandardowy nagłówek, zanim zostanie wysłany do użytkownika, zgadza się?
emka86

Odpowiedzi:

31

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.

Sebastian Goodman
źródło
czy można dodawać Securei HttpOnlyoznaczać pliki cookie odpowiedzi ? Jednak docelowy plik cookie odpowiedzi ma tylko plik cookie namei expireatrybuty.
JPaulPunzalan
2
Nie musisz koniecznie potrzebować biblioteki, aby móc zmieniać lub dodawać nagłówki odpowiedzi, aw przeciwieństwie do odpowiedzi, która uzyskała najwięcej głosów, możesz zastąpić nagłówek, po prostu musisz go najpierw usunąć. Sprawdź moją odpowiedź poniżej, aby uzyskać szczegółowe informacje.
Wilt
162

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.

Oliver
źródło
41
Od nginx 1.7.5 możesz użyć "always", aby dołączyć własne nagłówki w odpowiedziach na błędy za pomocą add_header:add_header X-Upstream $upstream_addr always;
Shane
W każdym razie, aby mieć podobną funkcjonalność bez ujawniania kombinacji adresu IP / portu serwera proxy? np. X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 prawdopodobnie nie jest pomocny w maskowaniu infrastruktury, ale przekazuje ideę).
zamnuts
@zamnuts: Przekazywanie adresu IP i numerów portów nadawcy to tylko przykład zastosowania add_headerdyrektywy. W ogóle nie musisz ich wysyłać.
Oliver
@Oliver, jestem tego świadomy, ale pytałem o alternatywny indywidualny / unikalny identyfikator nadawcy inny niż numery IP / portów lub ich zaciemnienie. Może moje pytanie jest poza zakresem i powinienem stworzyć nowy post :)
zamnuts
@zamnuts: Proponuję też zadać nowe pytanie :-)
Oliver
25

Jak pisze Oliver:

add_headerdziała równie dobrze proxy_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;
Dmitry Minkovsky
źródło
5
Spędziłem dużo czasu zastanawiając się, dlaczego moje nagłówki się nie wyświetlają, próbując przenieść je do bloku serwera, bloku lokalizacji, ... a oto powód: nginx nie dodaje ich w odpowiedziach na błędy: F Dzięki
Shautieh
Ja też :) i pomimo tej odpowiedzi to znowu mi się przydarzyło. Musiałem przejrzeć własną odpowiedź.
Dmitry Minkovsky,
Szczegółowe informacje można znaleźć na stronie nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
Steve Eynon
15

Ukryj nagłówek odpowiedzi, a następnie dodaj nową niestandardową wartość nagłówka

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

AKTUALIZACJA:

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).

Więdnąć
źródło
Dzięki, wielka pomoc
Lancer.Yan
14

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;
emka86
źródło
6
Musiałem użyć tej metody, ponieważ nginx dodawał zduplikowany nagłówek, zamiast nadpisywać wyjściowy. 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