nginx 302 リダイレクトはネイキッド IP のみ

nginx 302 リダイレクトはネイキッド IP のみ

誰かが IP アドレスを入力した場合は 302 リダイレクトを設定し、そのドメインの www.subdomain へのその他のすべてのリクエストは 301 に設定しようとしています。

server {
    listen 198.251.86.133:80;
    server_name 198.251.86.133;
    return 302 http://www.jacobdevans.com/anycast-301/;
}

server {
    listen 198.251.86.133:80;
    server_name _;
    return 301 http://www.$host$request_uri;
}

301 は機能していますが、上記の 302 セクションを追加すると、誰でも (https 以外) A レコードのルートドメインを 301 を簡単に実行できる場所にポイントできるようになります (example.com を www.example.com に)。

現在、最初のリスニングオプションですべてがキャッチされます

# curl -I jacobdevans.com
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.6.3
Date: Mon, 28 Sep 2015 20:08:45 GMT
Content-Type: text/html
Content-Length: 160
Connection: keep-alive
Location: http://www.jacobdevans.com/anycast-301/

# curl -I 198.251.86.133
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.6.3
Date: Mon, 28 Sep 2015 20:08:56 GMT
Content-Type: text/html
Content-Length: 160
Connection: keep-alive
Location: http://www.jacobdevans.com/anycast-301/

http://www.redirect-checker.orgルクセンブルクから引きます

ありがとう!

答え1

同じ listen ディレクティブに一致する間は両方が読み取られないため、単一のサーバー ブロックが必要になります。

希望する結果を得るには、次のようにブロックを変更する必要があります。

server {
   listen 80;
   server_name 198.251.86.133;
   return 302 http://www.jacobdevans.com/anycast-301/;
}

server {
   listen 80 default_server;
   return 302 http://www.$host$request_uri;
}

default_server を設定し、そのブロックを「キャッチオール」として許可しながら、着信 HOST ヘッダーに一致する IP を明示的に定義すると、直接 IP に対するすべての要求が にリダイレクトされhttp://www.jacobdevans.com/anycast-301/、残りは にリダイレクトされますhttp://www.$host$request_uri

答え2

引用符で囲むと、期待どおりになります。

server {
    listen 198.251.86.133:80;
    server_name "198.251.86.133";
    return 302 http://www.jacobdevans.com/anycast-301/;
}

server {
    listen 198.251.86.133:80 default_server;
    server_name _;
    return 301 http://www.$host$request_uri;
}

関連情報