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

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

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



답변

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

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

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


답변

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.


답변

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

add_headerproxy_pass없이도 잘 작동합니다 .

그러나 Shane이 쓴 것처럼 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;


답변