Apache mod_rewriteの仕組み、設定方法、動作確認の方法などについてまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
簡単な設定例で動作確認
1)環境の準備
・ディレクトリ
/php/mod_rewrite/
・ファイル
/php/mod_rewrite/.htaccess
/php/mod_rewrite/user.php
・user.phpの内容
<?php
$id = $_GET[‘id’];
echo “user=” . $id;
?>
・Apacheのhttpd.conf
.htaccessファイルを使用できるようにする
AllowOverride FileInfo
リライトログを出力する
RewriteLog “logs/rewrite.log”
RewriteLogLevel 2
2).htaccess内にリライトの設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
※正規表現の説明
^ 入力の先頭
(\w) 単語構成文字。マッチした文字は$1に保持。
/? ”/”はオプション。ついても1つついてもOK。
$ 入力の末尾
3)動作確認
http://localhost/php/mod_rewrite/user/ → マッチしない
http://localhost/php/mod_rewrite/user/tom → マッチ
http://localhost/php/mod_rewrite/user/tom/ → マッチ
http://localhost/php/mod_rewrite/user/tom/new → マッチしない
・ディレクトリ
/php/mod_rewrite/
・ファイル
/php/mod_rewrite/.htaccess
/php/mod_rewrite/user.php
・user.phpの内容
<?php
$id = $_GET[‘id’];
echo “user=” . $id;
?>
・Apacheのhttpd.conf
.htaccessファイルを使用できるようにする
AllowOverride FileInfo
リライトログを出力する
RewriteLog “logs/rewrite.log”
RewriteLogLevel 2
2).htaccess内にリライトの設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
※正規表現の説明
^ 入力の先頭
(\w) 単語構成文字。マッチした文字は$1に保持。
/? ”/”はオプション。ついても1つついてもOK。
$ 入力の末尾
3)動作確認
http://localhost/php/mod_rewrite/user/ → マッチしない
http://localhost/php/mod_rewrite/user/tom → マッチ
http://localhost/php/mod_rewrite/user/tom/ → マッチ
http://localhost/php/mod_rewrite/user/tom/new → マッチしない
RewriteRuleとRewriteCondの構文
1)RewriteRuleの書式
RewriteRule Pattern Substitution [flags]
①Pattern
・URL部に対する正規表現。
②Substitution
・パターンにマッチした部分を置換。
・絶対パスを指定。
・フルURLへリダイレクト。
・”-“を指定して何もしない。
③flags
・forbidden|F
・last|L
・redirect|R[=code]
・nocase|NC
・proxy|P
・その他HTTPヘッダーを設定
2)RewriteCondの書式
RewriteCond TestString CondPattern [flags]
①TestString
・%{VARIABLE}のフォーマットでサーバー変数を指定。
②CondPattern
・正規表現
・文字列比較
・ファイルやパスのテスト
③flags
・’nocase|NC’ (no case)
・’ornext|OR’ (or next condition)
・’novary|NV’ (no vary)
RewriteRule Pattern Substitution [flags]
①Pattern
・URL部に対する正規表現。
②Substitution
・パターンにマッチした部分を置換。
・絶対パスを指定。
・フルURLへリダイレクト。
・”-“を指定して何もしない。
③flags
・forbidden|F
・last|L
・redirect|R[=code]
・nocase|NC
・proxy|P
・その他HTTPヘッダーを設定
2)RewriteCondの書式
RewriteCond TestString CondPattern [flags]
①TestString
・%{VARIABLE}のフォーマットでサーバー変数を指定。
②CondPattern
・正規表現
・文字列比較
・ファイルやパスのテスト
③flags
・’nocase|NC’ (no case)
・’ornext|OR’ (or next condition)
・’novary|NV’ (no vary)
mod_rewrite設定の注意点、処理フロー
1)主なサーバー変数
例)下記リクエストの場合にサーバー変数に割り当てられる内容
GET /user.php?id=tom HTTP/1.1
%{THE_REQUEST}:GET /user.php?id=tom HTTP/1.1
%{REQUEST_METHOD}:GET
%{REQUEST_PROTOCOL}:HTTP
%{QUERY_STRING}:id=tom
%{REQUEST_URI}:/user.php
2)設定例
php/mod_rewriteディレクトリ内の.htaccessファイルに設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
RewriteCond %{THE_REQUEST} user\.php
RewriteRule ^user\.php – [F]
3)設定時の注意点
・上から順番に処理される。
・ <Directory>セクションや.htaccess内に設定した場合は、先頭のスラッシュは除去される。
・RewriteRuleでマッチングされるのは、URLのパス部分でクエリストリング以降は含まれない。mod_rewriteディレクトリ内の.htaccessで”http://localhost/php/mod_rewrite/user.php?id=tom”の場合は、”user.php”がチェック対象のURL。
ホスト名、ポート番号、クエリストリングをチェックしたい場合は、RewriteCondで設定する。
・RewriteCondは一つのRewriteRuleに結びつけられ、RewriteRuleより前に記述する。
・RewriteRuleによってURLが書き換えられ、次のRewriteRuleに処理が進んだ場合、書き換えられたURLを使ってチェックされる。
4)処理フローの概要
①URLがRewriteRuleで指定したパターンにマッチし、該当するRewriteRuleに結び付けられたすべてのRewriteCondで指定した条件を満たした場合、RewriteRuleで設定したパターンにURLが書き換えられる。
②次のRewriteRuleがある場合は、書き換えられたURLを使って同様に処理される。
5)動作確認
①http://localhost/php/mod_rewrite/user/tom/のURLでリクエスト
●1番目のルール
“user/tom/”がRewriteRuleのパターンにマッチし、user.php?id=tomに変換。
●2番目ルール
上記①で書き換えられた”user.php?id=tom”のうち、クエリストリングの前までのパス”user.php”を使ってRewriteRuleのパターンをチェック。
RewriteRuleで指定したパターンにはマッチするが、RewriteCondで指定した%{THE_REQUEST}(GET /php/mod_rewrite/user/tom/ HTTP/1.1)の条件を満たさないので適用されない。
②http://localhost/php/mod_rewrite/user.php?id=tomのURLでリクエスト
●1番目のルール
“user.php”がRewriteRuleで指定したパターンにはマッチしない。
●2番目ルール
RewriteRuleで指定したパターンにマッチし、RewriteCondで指定した条件も満たすのでRewriteRuleが適用される。Fフラグ指定されているのでForbiddenでアクセスが拒否される。
例)下記リクエストの場合にサーバー変数に割り当てられる内容
GET /user.php?id=tom HTTP/1.1
%{THE_REQUEST}:GET /user.php?id=tom HTTP/1.1
%{REQUEST_METHOD}:GET
%{REQUEST_PROTOCOL}:HTTP
%{QUERY_STRING}:id=tom
%{REQUEST_URI}:/user.php
2)設定例
php/mod_rewriteディレクトリ内の.htaccessファイルに設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
RewriteCond %{THE_REQUEST} user\.php
RewriteRule ^user\.php – [F]
3)設定時の注意点
・上から順番に処理される。
・ <Directory>セクションや.htaccess内に設定した場合は、先頭のスラッシュは除去される。
・RewriteRuleでマッチングされるのは、URLのパス部分でクエリストリング以降は含まれない。mod_rewriteディレクトリ内の.htaccessで”http://localhost/php/mod_rewrite/user.php?id=tom”の場合は、”user.php”がチェック対象のURL。
ホスト名、ポート番号、クエリストリングをチェックしたい場合は、RewriteCondで設定する。
・RewriteCondは一つのRewriteRuleに結びつけられ、RewriteRuleより前に記述する。
・RewriteRuleによってURLが書き換えられ、次のRewriteRuleに処理が進んだ場合、書き換えられたURLを使ってチェックされる。
4)処理フローの概要
①URLがRewriteRuleで指定したパターンにマッチし、該当するRewriteRuleに結び付けられたすべてのRewriteCondで指定した条件を満たした場合、RewriteRuleで設定したパターンにURLが書き換えられる。
②次のRewriteRuleがある場合は、書き換えられたURLを使って同様に処理される。
5)動作確認
①http://localhost/php/mod_rewrite/user/tom/のURLでリクエスト
●1番目のルール
“user/tom/”がRewriteRuleのパターンにマッチし、user.php?id=tomに変換。
●2番目ルール
上記①で書き換えられた”user.php?id=tom”のうち、クエリストリングの前までのパス”user.php”を使ってRewriteRuleのパターンをチェック。
RewriteRuleで指定したパターンにはマッチするが、RewriteCondで指定した%{THE_REQUEST}(GET /php/mod_rewrite/user/tom/ HTTP/1.1)の条件を満たさないので適用されない。
②http://localhost/php/mod_rewrite/user.php?id=tomのURLでリクエスト
●1番目のルール
“user.php”がRewriteRuleで指定したパターンにはマッチしない。
●2番目ルール
RewriteRuleで指定したパターンにマッチし、RewriteCondで指定した条件も満たすのでRewriteRuleが適用される。Fフラグ指定されているのでForbiddenでアクセスが拒否される。