proxy_pass를 사용할 때 nginx에 응답 헤더를 추가하는 방법은 무엇입니까?


92

nginx 뒤의 서버에서받은 응답에 대한 사용자 지정 헤더를 추가하고 싶습니다.

add_headernginx 처리 응답에 대해 작동 하지만 proxy_pass이 사용 되면 아무 작업도 수행하지 않습니다 .


따라서 요청을 프록시와 해당 프록시 세트 응답에 전달하고이 응답에서 사용자에게 보내기 전에 사용자 지정 헤더를 추가하고 싶습니다. 맞습니까?
emka86

답변:


31

헤더를 더 잘 제어 할 수있는 HttpHeadersMoreModule 이라는 모듈 이 있습니다. Nginx와 함께 제공되지 않으며 추가 설치가 필요합니다. 그것으로 다음과 같이 할 수 있습니다.

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

그러면 "서버 출력 헤더를 모든 상태 코드 및 모든 콘텐츠 유형에 대한 사용자 정의 값으로 설정"합니다. 이미 설정된 헤더를 대체하거나 설정되지 않은 경우 추가합니다.


응답 쿠키 에 추가 Secure하고 HttpOnly플래그를 지정할 수 있습니까? 목표 응답 쿠키는 단지 쿠키가 및 속성 불구을. nameexpire
JPaulPunzalan

2
응답 헤더를 변경하거나 추가하기 위해 반드시 라이브러리가 필요하지는 않으며 가장 많이 찬성 된 답변과는 반대로 헤더를 재정의 할 수 있습니다. 먼저 헤더를 제거하기 만하면됩니다. 자세한 내용은 아래 내 대답을 확인 하십시오.
Wilt

162

add_headerproxy_pass없이도 잘 작동합니다 . 오늘 방금 그 지시문을 정확히 사용한 구성을 설정했습니다. 그래도 이유를 정확히 기억하지 않고 이것을 설정하는 데 어려움을 겪었다는 것을 인정해야합니다.

지금은 작동하는 구성이 있으며 다음과 같은 내용이 포함되어 있습니다.

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

nginx 이전에는 1.7.5 add_header 가 성공적인 응답에서만 작동했지만 Sebastian Goodman이 그의 답변에서 언급 한 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;
Shane

어쨌든 프록시 서버의 IP / 포트 조합을 노출하지 않고 유사한 기능을 가지고 있습니까? 예 : X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5는 아마도 인프라를 마스킹하는 데 도움이되지 않지만 아이디어를 전달합니다).
zamnuts

@zamnuts : 업스트림 IP 및 포트 번호를 전달하는 것은 add_header지시문 을 사용하는 예일뿐입니다 . 당신 이없는 전혀 보낼 수 있습니다.
올리버

@Oliver, 알고 있지만 IP / 포트 번호 이외의 대체 개인 / 고유 업스트림 식별자 또는 그 난독 화에 대해 문의했습니다. 아마도 :) 내 질문의 범위를 벗어 나는 새 게시물을 작성해야합니다
zamnuts

@zamnuts : 나는 :-) 너무, 새로운 질문을 제안
올리버

25

올리버는 다음과 같이 썼습니다.

add_headerproxy_pass없이도 잘 작동합니다 .

그러나 Shane이 쓴 것처럼 Nginx 1.7.5부터는 다음 과 같이 오류 응답을 처리 always하기 위해 통과해야합니다 add_header.

add_header  X-Upstream  $upstream_addr always;

5
나는 왜 내 헤더가 표시되지 않는지 궁금해서 서버 블록, 위치 블록, ... 그리고 그 이유는 다음과 같습니다 : nginx가 오류 응답에 추가하지 않습니다 : F 감사합니다
Shautieh

저도 :) 그리고이 대답에도 불구하고 이것은 요 전에 다시 나에게 일어났습니다. 내 대답을 검토해야했습니다.
Dmitry Minkovsky


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 요청이 추가로 전송되기 전에 요청 헤더를 설정하기위한 것이지 응답 헤더를 설정하기위한 것이 아닙니다 (헤더에 대한 이러한 구성 속성은 약간 혼동 될 수 있음).


감사합니다, 큰 도움
Lancer.Yan

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 2018
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.