nginxのrewriteを使ったリダイレクト

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

nginxでは、
設定ファイル(/etc/nginx/nginx.conf)にrewrite文を書くだけで
URLをリダイレクトすることができます。

rewriteの使い方

rewirteを使用するときはこのような書式で設定し、
server, location, ifディレクティブ内に設定します。

rewrite regex replacement [flag];

regex : 正規表現でのマッチパターン※Apacheと違いURIのパラメータは「/」から始まります。
replacement : マッチパターンに一致した場合の変換パターン
flag : リダイレクトフラグ

最後のリダイレクトフラグの指定によって、HTTPのステータスコードを変えることができます。指定できるのは下記のものとなっています。

▼last

rewriteディレクティブの処理を停止し、書き換えられたURIに対して最初から locationを再検索します。
また、別のlocationにあるrewriteディレクティブは実行されます。

▼break

rewriteディレクティブの処理の停止し、locationの検索を停止します。
また、別のlocationにあるrewriteディレクティブは実行されません。

▼permanent

恒久的なリダイレクトをするときに使用します。
HTTPのステータスコードは「301」を返します。

▼redirect

一時的なリダイレクトをするときに使用します。
HTTPのステータスコードは「302」を返します。
リダイレクトの説明はこれくらいにして、実際にリダイレクトの例をいくつかあげてみます。

■wwwなしのURL(example.com)を
www付きのURL(www.example.com)にリダイレクトさせる

■特定のURL(/test1)をリダイレクトさせる

■rewriteで正規表現を使って設定する

rewriteでは正規表現を使用可能です。
引数として入力された文字列を$1として受け取って利用できるので、
http://www.example.com/rewrite/index.htmlにアクセスすると、
http://www.example.com/rewrite.htmlが表示されます。

■ELBを使ってhttpをhttpsにリダイレクトする設定

サイトをhttpsで公開したいときにELBで443→80に転送しようとすると、

1.80で待っているNginxにアクセスが行く
2.rewirteに従ってhttps(443)に転送される
3.ELBで443→80に転送される(1に戻る)

のようにリダイレクトループが発生してしまいます。
リダイレクトループが発生しないように設定する必要があります。

このように、
クライアントとロードバランサーの間で使用されたプロトコルを判別する「X-Forwarded-Proto」リクエストヘッダーを使用することで
リダイレクトループを発生させずにhttpをhttpsにリダイレクトさせることができます。