リバースプロキシとして使用する場合、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はここでは許可されていないと文句を言います。

私が考えることができる他の唯一のオプションは、2つのサーバーを別々に定義proxy_redirectし、SSL サーバーのみに設定することですが、その後、confの残りを複製することになります(server簡単にするために省略したディレクティブにはたくさんあります)。includeディレクティブを使用して冗長性を除外することもできますが、依存関係のないconfファイルを1つだけ保持したいのです。

だから、最初に、問題を完全に否定する私が見逃しているものがありますか?または、もしそうでない場合、サーバー構成のHTTPバージョンとHTTPSバージョンを分離できるように、冗長構成情報を除外する他の方法(外部ファイルを含む)がありますか?

回答:


29

さて、私は少しインスピレーションを得て、試しました:

proxy_redirect http:// $scheme://;

これがトリックのようです。しかし、これはまだ私にはハッキーだと思われるので、同じ結果を達成するために間違っている、またはあまりハッキーでない方法を行っている可能性のあることについてのガイダンスを歓迎します。


確かに、それはそれを行うには「公式」な方法のようです...見wiki.nginx.org/SSL-Offloader
Hendy Irawan

上記のnginx wikiへのリンクは機能しません。新しい場所はnginx.com/resources/wiki/start/topics/examples/SSL-Offloader
ポールトビアス

ロケーションに末尾のスラッシュがない場合、これは機能しません
-hdave

クソ、クソ、ソフトウェアが逆プロキシの背後に住むことを期待できないのはなぜか(あるいは少なくともX-Forwarded-Schemeを尊重するのか?blet +
Axel Latvala

5

もう1つの解決策は、要求がHTTPかHTTPSかをアップストリームに示し、それに応じてリダイレクトを発行させることです。これをnginx構成に追加すると、検査するアップストリームのヘッダーが設定されます。

proxy_set_header    X-Scheme $scheme;

ああ、あなたはすでにその構成を持っていることがわかりました。
mgorven

うん。しかし、私はそれでも助けようとする試みに感謝しています。
クリスプラット

4
これはちょっとしたヘッダーのようです。X-Forwarded-Protoの方が良いと思います
vladkras
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.