リクエストURIを条件に応じて書き換えたり、リダイレクトする機能を使うときはrewriteを使います。こちら非常によく使う機能です。
具体的な例を見ていきましょう。
1 |
rewrite ^/users/(.*)$ /show?user=$1?; |
これはフレームワークでみられますが、パスをクエリストリングに変更する設定例です。例えば/users/1などでアクセスがあった場合、/show?users=1に書き換えられ処理が行われます。
この例でも使用しているようにrewrite表現部分の()内の値をリプレイスメント内の$1で参照しています。$1なのあとの?はもとのリクエストのクエリストリングを無視することを意味します。
例えば/user/1?key=valueのようなアクセスがあった場合、/show?user=1?key=valueに書き換えられるのを防ぐことができます。
rewriteディレクティブは下記のような記述方法で設定します。
rewrite 正規表現 リプレイスメント フラグ
フラグ一覧
なし rewriteを実行し、そのまま処理を継続
last rewriteを実行し、すべてのlocationを対象に再度処理をはじめから実行
break rewriteを実行し、一度実行したlocationは対象外にして処理をはじめから実行
redirect ステータスコード302でリダイレクト
permanent ステータスコード301でリダイレクト
よくあるrewriteパターン
検索の実行
1 2 3 4 5 |
入力URL http://sample.com/search/hogehoge rewirteルール rewrite ^/search/(.*?)$ /search.php?q=$1?; rewrite後のURI http://sample.com/search.php?q=hogehoge |
ユーザープロファイルページ
1 2 3 4 5 |
入力URL http://sample.com/user/31/james rewirteルール rewrite ^/user/([0-9]+)/(.*?)$ /user.php?id=$1&name=$2?; rewrite後のURI http://sample.com/user.php?id=31&name=james |
複数の引数
1 2 3 4 5 |
入力URL http://sample.com/index.php/param1/param2 rewirteルール rewrite ^/index.php/(.*?)/(.*?)$ /index.php?p1=$1&p2=$2?; rewrite後のURI http://sample.com/index.php?q1=param1&q2=param2 |
1つのパスに複数の情報
1 2 3 4 5 |
入力URL http://sample.com/topic-1234-50-somekey.html rewirteルール rewrite ^/topic-([0-9]+)-([0-9]+)-(.*?)\.html$ /viewtopic.php?topic=$1&start=$2?; rewrite後のURI http://sample.com/viewtopic.php?topic=1234&start=50 |