[server] 리버스 프록시로 사용될 때 nginx가 https에서 http로 트래픽을 리디렉션하지 못하도록 방지

축약 된 nginx vhost conf는 다음과 같습니다.

upstream gunicorn {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    listen 80;
    listen 443 ssl;
    server_name domain.com ~^.+\.domain\.com$;

    location / {
        try_files $uri @proxy;
    }

    location @proxy {
        proxy_pass_header Server;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 120;
        proxy_pass http://gunicorn;
    }
}

동일한 서버에서 HTTP와 HTTPS를 모두 제공해야하지만 업스트림에서 리디렉션이 발생하면 (예 : 양식이 처리 된 후) 모든 HTTPS 요청이 HTTP로 리디렉션됩니다. 이 문제를 해결하는 유일한 방법 proxy_redirect은 다음으로 변경 됩니다.

proxy_redirect http:// https://;

그것은 HTTPS에서 오는 요청에 훌륭하게 작동하지만 HTTP를 통해 리디렉션이 발행되면 HTTPS로 리디렉션합니다. 이것은 문제입니다.

필사적으로 나는 다음을 시도했다.

if ($scheme = 'https') {
    proxy_redirect http:// https://;
}

그러나 nginx proxy_redirect는 여기서 허용되지 않는다고 불평합니다 .

내가 생각할 수있는 유일한 다른 옵션은 두 서버를 개별적으로 정의하고 proxy_redirectSSL 서버 에서만 설정하는 것입니다.하지만 나머지 conf를 복제합니다 ( server지침을 위해 생략 된 지시문 에는 많은 것이 있습니다). include중복성을 제거 하기 위해 지시문을 사용할 수도 있지만 종속성없이 하나의 conf 파일 만 유지하려고합니다.

먼저, 내가 누락 된 것이 문제를 완전히 무효화 할 수 있습니까? 또는 둘째, 그렇지 않은 경우 서버 구성의 HTTP 및 HTTPS 버전을 분리 할 수 ​​있도록 중복 구성 정보를 제거 할 수있는 다른 방법 (외부 파일 포함)이 있습니까?



답변

글쎄, 나는 약간의 영감을 얻었고 시도했다.

proxy_redirect http:// $scheme://;

트릭을 수행하는 것 같습니다. 그래도 여전히 나에게는 해키처럼 보이므로 동일한 결과를 얻기 위해 내가 잘못하거나 덜 해킹 된 방법에 대한 지침을 여전히 환영합니다.


답변

다른 해결책은 요청이 HTTP인지 HTTPS인지를 업스트림에 알리고 이에 따라 리디렉션을 발행하는 것입니다. nginx 설정에서 이것을 추가하면 업스트림이 검사 할 헤더를 설정합니다.

proxy_set_header    X-Scheme $scheme;


답변