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


16

축약 된 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 버전을 분리 할 수 ​​있도록 중복 구성 정보를 제거 할 수있는 다른 방법 (외부 파일 포함)이 있습니까?

답변:


29

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

proxy_redirect http:// $scheme://;

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


실제로, 그것은 그것을하는 "공식적인"방법 인 것 같습니다 ... wiki.nginx.org/SSL-Offloader
Hendy Irawan

위의 nginx 위키 링크는 더 이상 작동하지 않습니다. 새로운 위치는 nginx.com/resources/wiki/start/topics/examples/SSL-Offloader
Paul Tobias

위치에 슬래시가 없으면 작동하지 않습니다.
hdave

? 빌어 먹을 빌어 먹을 신, 왜 소프트웨어는 리버스 프록시 (을 얻거나, 빌어 먹을 존중 X-전달-계획 또는 어떤 blet + 뒤에 살기를 기대할 수 없다 않는다
악셀 라트 발라

5

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

proxy_set_header    X-Scheme $scheme;

아, 이제 당신은 이미 그 구성을 가지고 있습니다.
mgorven

네. 그럼에도 불구하고 도와 주려는 노력에 감사드립니다.
Chris Pratt

4
이것은 약간 까다로운 헤더 인 것 같습니다. 내가 생각하는 X-전달 - 프로토가 더 좋다
vladkras
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.