![nginx が /2013/04/test.html を /test にリダイレクトする - 動作しない](https://rvso.com/image/623652/nginx%20%E3%81%8C%20%2F2013%2F04%2Ftest.html%20%E3%82%92%20%2Ftest%20%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%99%E3%82%8B%20-%20%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84.png)
このことで頭がおかしくなりそうです。nginx で特定の URL をリダイレクトするにはどうすればいいでしょう/2013/04/test.html
か/test
?
これを試してみましたが、うまくいきませんでした:
server {
location /2013/05/test.html {
return 301 http://$server_name/test;
}
}
いくつかテストを実行しましたが、何らかの理由で、構成行の場所部分に .html 拡張子のない URL は適切にリダイレクトされますが、場所に .html を配置するとすぐに、動作しなくなります。
なぜそうなるのか、何かご存知ですか? ありがとうございます!
答え1
リダイレクトごとにロケーション ブロックを用意するのではなく、既存のロケーション ブロックに書き換えルールを追加することもできます。
rewrite /2013/05/test.html http://$server_name/test permanent;
rewrite /2013/05/test2.html http://$server_name/test2 permanent;
さまざまな正規表現を使用することもできるので、新しい「パーマリンク」が追加されるたびに新しい正規表現を追加する必要がなくなります。
答え2
私はジェイソン・イリチッチに同意します。書き換えルールおそらくより効率的でしょう。
本当に使いたいならロケーションブロック、「=」修飾子を使用してみましたか? 複数の場所がある場合、Nginx の選択ロジックによって、予想とは異なる場所が選択される場合があります。
Nginxドキュメントより
using the “=” modifier it is possible to define an exact match of URI and location
例えば
server {
location = /2013/05/test.html {
return 301 http://$server_name/test;
}
}