nginx 뒤의 서버에서받은 응답에 대한 사용자 지정 헤더를 추가하고 싶습니다.
add_header
nginx 처리 응답에 대해 작동 하지만 proxy_pass
이 사용 되면 아무 작업도 수행하지 않습니다 .
답변:
헤더를 더 잘 제어 할 수있는 HttpHeadersMoreModule 이라는 모듈 이 있습니다. Nginx와 함께 제공되지 않으며 추가 설치가 필요합니다. 그것으로 다음과 같이 할 수 있습니다.
location ... {
more_set_headers "Server: my_server";
}
그러면 "서버 출력 헤더를 모든 상태 코드 및 모든 콘텐츠 유형에 대한 사용자 정의 값으로 설정"합니다. 이미 설정된 헤더를 대체하거나 설정되지 않은 경우 추가합니다.
Secure
하고 HttpOnly
플래그를 지정할 수 있습니까? 목표 응답 쿠키는 단지 쿠키가 및 속성 불구을. name
expire
add_header
proxy_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_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5는 아마도 인프라를 마스킹하는 데 도움이되지 않지만 아이디어를 전달합니다).
add_header
지시문 을 사용하는 예일뿐입니다 . 당신 이없는 전혀 보낼 수 있습니다.
올리버는 다음과 같이 썼습니다.
add_header
proxy_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;
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"; } }