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のままにしておきます。私に何ができる?
この問題を修正するのに最適な場所は、SSL接続が終了するところです。 nginx
を実行している場合は、proxy_redirect
ステートメントを使用して、http
ヘッダーのhttps
をLocation
にマップします。 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 / {
}
...
}
これを試して
server {
root /var/www;
include /etc/nginx/basic.conf;
try_files $uri $uri/;
}
それが機能しない場合は、質問を編集して、basic.confおよびnginx.confにあるものをすべて含めてください。また、応答ヘッダーと対応する単一のNginxアクセスログファイルを含め、問題を示すカールを実行します。
「evil if」文を使用してみることができます。
server {
...
if ($http_x_forwarded_proto = 'http' ) {
rewrite ^ https://$Host$request_uri? permanent;
}
...
}