ここに私の短縮された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
はここでは許可されていないと文句を言います。
私が考えることができる他の唯一のオプションは、2つのサーバーを別々に定義proxy_redirect
し、SSL サーバーのみに設定することですが、その後、confの残りを複製することになります(server
簡単にするために省略したディレクティブにはたくさんあります)。include
ディレクティブを使用して冗長性を除外することもできますが、依存関係のないconfファイルを1つだけ保持したいのです。
だから、最初に、問題を完全に否定する私が見逃しているものがありますか?または、もしそうでない場合、サーバー構成のHTTPバージョンとHTTPSバージョンを分離できるように、冗長構成情報を除外する他の方法(外部ファイルを含む)がありますか?