skillup

技術ブログ

サーバー・ネットワーク

rewriteディレクティブ

投稿日:2016年12月11日 更新日:

リクエストURIを条件に応じて書き換えたり、リダイレクトする機能を使うときはrewriteを使います。こちら非常によく使う機能です。

具体的な例を見ていきましょう。

これはフレームワークでみられますが、パスをクエリストリングに変更する設定例です。例えば/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パターン

検索の実行

入力URL                 http://sample.com/search/hogehoge

rewirteルール         rewrite  ^/search/(.*?)$   /search.php?q=$1?;

rewrite後のURI       http://sample.com/search.php?q=hogehoge

ユーザープロファイルページ

入力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

複数の引数

入力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つのパスに複数の情報

入力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

参考文献

Nginx入門

-サーバー・ネットワーク
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

サーバー調査(主にログ調査に関して)

実務でサーバーなどの調子が悪いときに見るポイントなどをリストアップ。 基本はログの調査 プログラムも同じだと思いますが、基本的にはログを見ていくことになります。 見たほうが良いログなどは下記のもの C …

no image

ログ抽出コマンド特集 その2 シェルスクリプトの算術計算、配列とループ

前回の続きですが、ログを収集し、分布(80%台が~%、70%台が~%)を出したいとします。 Contents1 ロジック2 ソース3 気づいたこと4 参考リンク ロジック ロジックは以下のような流れに …

no image

locationディレクティブについて

nginxを実務で使うときに重要になってくるlocationディレクティブについて。 ここでは実際のlocationディレクトリとマッチするURLのパターンを見ていきたいと思います。 Contents …

no image

追跡ブランチからローカルブランチを作る方法~ (svn→gitの移行など)

SVNで運用されていたプロジェクトをgitに移行する機会があったのでその時のメモなどを。 思ってたよりは楽だったかな・・・ Contents1 準備2 実際の移行(git svn clone)3 gi …

no image

scpコマンドを使ったサーバー間のファイルのやり取り

あるサーバーのファイルを別サーバーにコピーするとき、大昔はFTPを使っていましたが、現在FTPサーバー自体を立てることがあまりないため、SSHを使ったSCPコマンドでのファイル点を使いました。 Con …