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)にリダイレクトさせる
1 2 3 4 5 6 |
server { listen 80; server_name example.com; rewrite ^(.*)$ http://www.example.com$1 permanent; } |
■特定のURL(/test1)をリダイレクトさせる
1 2 3 4 5 6 |
server { listen 80; server_name www.example.com; rewrite ^/test1(.*)$ http://www.example.com/test001$1 permanent; } |
■rewriteで正規表現を使って設定する
1 2 3 4 5 6 |
server { listen 80; server_name www.example.com; rewrite ^/(.*)/index.html$ $1.html redirect; } |
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に戻る)
のようにリダイレクトループが発生してしまいます。
リダイレクトループが発生しないように設定する必要があります。
1 2 3 4 5 6 7 8 |
server { listen 80; server_name www.example.com; if ($http_x_forwarded_proto != https) { rewrite ^(.*)$ https://www.example.com$1 permanent; } } |
このように、
クライアントとロードバランサーの間で使用されたプロトコルを判別する「X-Forwarded-Proto」リクエストヘッダーを使用することで
リダイレクトループを発生させずにhttpをhttpsにリダイレクトさせることができます。
投稿者プロフィール
-
2024 Japan AWS Top Engineers
AWSを使ったサーバレスアーキテクチャ・コンテナサービスの設計・構築を担当。