web-dev-qa-db-ja.com

AWSでHTTPSからHTTPへのnginxリダイレクトを防ぐ方法は?

AWS ELBロードバランサーの背後にnginxが提供するウェブサイトがあります。ロードバランサーではHTTPSのみが有効になっています。

個々のファイル、または末尾にスラッシュが付いたディレクトリの要求は正常に機能します。ただし、末尾のスラッシュを付けずにを要求しても機能しません。

理由は、末尾のスラッシュなしでディレクトリを要求すると、nginxはパスにリダイレクトしますwith末尾のスラッシュ(大丈夫です)が、それはまた、HTTPSからHTTPに変更されます。ロードバランサーはHTTPSのみを許可するように構成されているため、機能しません(タイムアウト)。

Nginxログファイルで、リクエストがnginxに到達し、301パーマネントリダイレクトで応答するのはnginxであることがわかります(したがって、ロードバランサーのセットアップの問題ではありません)。

10.100.10.15 - - [24/Nov/2017:15:41:08 +0000] "GET /admin HTTP/1.1" 301 178 "-" "Wget/1.18 (darwin16.0.0)"

curl経由でURLをリクエストすると、リダイレクトが表示されます:

$ curl -v https://example.com/admin
*   Trying 1.2.3.4...
* TCP_NODELAY set
* Connected to example.com (1.2.3.4) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: example.com
* Server certificate: Amazon
* Server certificate: Amazon Root CA 1
* Server certificate: Starfield Services Root Certificate Authority - G2
> GET /admin HTTP/1.1
> Host: example.com
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Mon, 27 Nov 2017 09:19:05 GMT
< Content-Type: text/html
< Content-Length: 178
< Connection: keep-alive
< Server: nginx
< Location: http://example.com/admin/
< X-UA-Compatible: IE=Edge
< 
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to Host example.com left intact

私のnginx設定ファイルはちょうどです

server {
    root /var/www;
}

/etc/nginx/nginx.confは here です。

私が試してみました server_name_in_redirect offですが、違いはありませんでした。

これはDockerイメージにパックされて別のホスト(QA、Prodなど)にデプロイされるため、構成ファイルにホスト名を含めることは避けたいと思います。

Nginxにこのリダイレクトを実行させたいのですが、HTTPSのままにしておきます。私に何ができる?

3
Adrian Smith

この問題を修正するのに最適な場所は、SSL接続が終了するところです。 nginxを実行している場合は、proxy_redirectステートメントを使用して、httpヘッダーのhttpsLocationにマップします。 AWS ELBを知らないので、そこで修正する方法についてコメントすることはできません。

特定の状況ではnginxがリダイレクトで応答し、スキームは接続に使用されたスキームと同じであると想定されます(つまり、AWS ELBから)。私の知る限り、バックエンドnginxサーバーの問題を軽減する方法は3つあります。


1)バージョン1.11.8以降、absolute_redirect off;ステートメントはLocationヘッダーに相対URLを使用させます。これは、スキームとドメイン名が欠落していることを意味します。

server {
    absolute_redirect off;
    ...
}

詳細は このドキュメント を参照してください。


2)/ステートメントを使用して、末尾のtry_filesをディレクトリに追加する動作を禁止します。

server {
    root /path/to/files;

    location / {
        try_files $uri =404;
    }
    ...
}

詳細は このドキュメント を参照してください。


3)明示的なreturnステートメントで問題を修正します。

server {
    root /path/to/files;

    location ~ [^/]$ {
        if (-d $request_filename) {
            return 302 https://$Host$uri/$is_args$args;
        }
    }

    location / {
    }
    ...
}

詳細は このドキュメント を、ifの使用については この注意 を参照してください。

5
Richard Smith

これを試して

server {
  root /var/www;
  include /etc/nginx/basic.conf;
  try_files $uri $uri/;
}

それが機能しない場合は、質問を編集して、basic.confおよびnginx.confにあるものをすべて含めてください。また、応答ヘッダーと対応する単一のNginxアクセスログファイルを含め、問題を示すカールを実行します。

1
Tim

「evil if」文を使用してみることができます。

server {
    ...
    if ($http_x_forwarded_proto = 'http' ) {
        rewrite ^ https://$Host$request_uri? permanent;
    }
    ...
}
0
Max