web-dev-qa-db-ja.com

ヘッダーの値に基づいてnginxをリダイレクトする方法は?

Cloudflareプロキシの背後にWebサイトをホストしています。つまり、CloudflareはHTTP(ポート80)およびHTTPS(ポート443)のトラフィックを処理しますが、サーバーへのすべてのリクエストはポート80を経由します。

2つを区別するために、Cloudflareには、ユーザーの接続に基づいて「http」または「https」に設定されるX-Forwarded-Protoヘッダーが含まれます。

X-Forwarded-Proto: httpヘッダーを持つすべてのリクエストをサイトのSSLバージョンにリダイレクトしたいと思います。 nginx構成でこれをどのように達成できますか?

28
Kevin Burke

これを行う最も簡単な方法は、ifディレクティブを使用することです。より良い方法があれば、ifディレクティブは非効率的だと人々が言うので、私に知らせてください。 Nginxはヘッダー内のダッシュをアンダースコアに変換するため、X-Forwarded-Proto$http_x_forwarded_protoになります。

server {
    listen 80;
    server_name example.com; # Replace this with your own hostname
    if ($http_x_forwarded_proto = "http") {
        return 301 https://example.com$request_uri;
    }

    # Rest of configuration goes here... 
}
42
Kevin Burke

Mapディレクティブを使用してみてください: http://nginx.org/en/docs/http/ngx_http_map_module.html#map

そんな感じ...

map $http_x_forwarded_proto     $php_backend {
    "https"          "https_php_backend named loc";
    default        "default_php_backend named loc";
}
server{
    location / {
         proxy_pass http://$php_backend;
    }
}

このコードは抽象的ですが、試してみることができます...

4
user989840