nginx는 upstream_http_ 변수에 조건부로 헤더를 추가합니다


19

nginx에 리버스 프록시가있어 꽤 많은 사이트를 프록시합니다. 최근에 모든 SSL 지원 웹 사이트에 대해 HTTP Strict Transport Security를 ​​활성화했습니다. 이 기능을 사용하지 않으려는 사이트가 하나 있습니다.

내 업스트림에서 이미 Strict-Transport-Security헤더를 보냈다면 간단하게 확인 하고 그렇지 않은 경우 하나만 추가한다고 생각했습니다 . 이렇게하면 업스트림 max-age=0에서 프록시로 HSTS를 사용하지 않도록 STS 헤더를 보낼 수 있습니다.

다음과 같이 구성을 변경한다고 생각했습니다.

location / {
        proxy_pass http://webservers;

        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";

        if ($upstream_http_strict_transport_security = "") {
                add_header Strict-Transport-Security "max-age=15552000";
        }
}

그러나 아마도 악한 경우 에는 작동하지 않습니다. 변수가 실제로 존재하는지 확인하기 위해 여러 가지를 시도했지만 아무것도 도움이되지 않는 것 같습니다.

이 작업을 어떻게 수행 할 수 있습니까?

답변:


22

요청이 백엔드로 전달되기 전에 if가 평가되므로 $ upstream_http_ 변수에 아직 값이 없으므로 작동하지 않습니다. 값이 비어있는 add_header는 무시되므로 을 사용하여 다음과 같이 조건부로 헤더를 추가 할 수 있습니다 .

map $upstream_http_strict_transport_security $sts {
  '' max-age=15552000;
}

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}

1
똑똑한지도 사용!
Alexey Ten

좋아, 조금 다른 것을 시도했지만 nginx를 알아낼 수 없었다. 어디서 nginx를 공식적으로 배울 수 있는지 말해 줄 수 있습니까? 또한 여기에서 도와 드릴 수 있습니다 : serverfault.com/questions/678521/…
Muhammad Umer

5

if프록시가 발생하기 전에 실행되기 때문에 현재로서는 변수가 없습니다 $upstream_http_strict_transport_security.

header_filter_by_luaLua 모듈에서 지시문을 사용할 수 있습니다 . 예 :

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';

1
작동합니다. 데비안 7에서는을 통해 백 포트에서 Nginx를 사용하여 LUA 지원을받을 수 있습니다 apt-get -t wheezy-backports install nginx-extras.
피터 엔느
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.