축약 된 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_redirect
SSL 서버 에서만 설정하는 것입니다.하지만 나머지 conf를 복제합니다 ( server
지침을 위해 생략 된 지시문 에는 많은 것이 있습니다). include
중복성을 제거 하기 위해 지시문을 사용할 수도 있지만 종속성없이 하나의 conf 파일 만 유지하려고합니다.
먼저, 내가 누락 된 것이 문제를 완전히 무효화 할 수 있습니까? 또는 둘째, 그렇지 않은 경우 서버 구성의 HTTP 및 HTTPS 버전을 분리 할 수 있도록 중복 구성 정보를 제거 할 수있는 다른 방법 (외부 파일 포함)이 있습니까?
답변
글쎄, 나는 약간의 영감을 얻었고 시도했다.
proxy_redirect http:// $scheme://;
트릭을 수행하는 것 같습니다. 그래도 여전히 나에게는 해키처럼 보이므로 동일한 결과를 얻기 위해 내가 잘못하거나 덜 해킹 된 방법에 대한 지침을 여전히 환영합니다.
답변
다른 해결책은 요청이 HTTP인지 HTTPS인지를 업스트림에 알리고 이에 따라 리디렉션을 발행하는 것입니다. nginx 설정에서 이것을 추가하면 업스트림이 검사 할 헤더를 설정합니다.
proxy_set_header X-Scheme $scheme;