Apache mod_rewriteの仕組み、設定方法、動作確認

Apache mod_rewriteの仕組み、設定方法、動作確認の方法などについてまとめました。
 

(1)簡単な設定例で動作確認


 
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 → マッチしない
 

(2)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)
 

(3)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でアクセスが拒否される。

関連記事の目次

コメントを残す

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