nginxのリダイレクト設定について

SSLのお話は置いておいて、忘れてしまいそうなのでnginxのリダイレクトのお話。

www付きのURLでアクセスされた場合、wwwなしのURLにリダイレクトする設定をすると捗ります。

server {
listen 80;
server_name www.example.net;
return 301 https://example.net$request_uri;
}

例えばこんな感じ。

上記の設定をすると、www.example.netに来たアクセスをすべてhttps://example.netにリダイレクトします。

しかし、この状態でサブドメイン(hoge)のページを設定すると、hoge.example.netでアクセスしてもリダイレクトされてしまうようです。

server {
listen 80;
server_name www;
return 301 https://example.net$request_uri;
}

というわけで解決策がこちら。server_nameにwwwのみを指定しています。

どうやら、とにかく一致する文字列があればリダイレクトしてしまうようで、ドメイン名まで書くとすべてリダイレクトされてしまうっぽいです。

で、wwwだけ書いておけば、wwwが付いているアクセスのみをリダイレクトしてくれます。

 

これ、正しいんですかね…?

 

追記

rewriteでリダイレクトする場合も同様の挙動をするようです。

rewrite ^/test/1.html http://example.org/re/1.html permanent;
rewrite ^/test/10.html http://example.org/re/10.html permanent;

この設定では/test/1.htmlに来たアクセスを/re/1.htmlにリダイレクト、/test/10.htmlに来たアクセスを/re/10.htmlにリダイレクトしたいということを書いています。

しかし、この設定では/test/10.htmlに来たアクセスまでもが/re/1.htmlに飛ばされてしまうようです。

上から順に判定していって、ひとつでもその文字が含まれていればその時点でリダイレクトされてしまいます。

rewrite ^/test/10.html http://example.org/re/10.html permanent;
rewrite ^/test/1.html http://example.org/re/1.html permanent;

これを回避するため、このように上下を入れ替えると10は10、1は1とリダイレクトされるようになります。1が10にリダイレクトされちゃいそうな気がするんですが、そういうわけでもないようです。

奥が深い・・・。