【mod_rewrite】 RewriteRuleとは?
ここではApacheのモジュール mod_rewriteのディレクティブの一つ「RewriteRule」について説明しています。
スポンサードリンク
RewriteRuleとは?
「RewriteRule」とは、mod_rewriteでのURL書き換えにおいて、書き換えそのものを行う構文です。「.htaccess」もしくは「httpd.conf」で利用できます。
「RewriteRule」の記述個数に制限はありませんが、上から順番に処理が行われていくので記述の順番は重要です。
書式
RewriteRule パターン 置換対象
・「パターン」は、わたってきたURLとマッチさせる部分です。正規表現を利用できます。
【注意】
「わたってきたURL」とは、リクエストされたURLとは限らず、書き換え処理をされてきたURLを指します。
・「置換対象」は、わたってきたURLと「パターン」がマッチした場合に、行う処理を指定する部分です。
使用例
環境
使用例を紹介する前に、環境を設定しておきます。
- ルートディレクトリ
/var/www/html/○○○/ - そこに「hoge.html」と「piyo.html」を作成
/var/www/html/○○○/hoge.html
/var/www/html/○○○/piyo.html
「http://○○○.com/hoge.html」でアクセスがあった場合、「/var/www/html/○○○/hoge.html」が出力されます。
RewriteRuleの使い方
では、「http://○○○.com/hoge.html」にアクセスがあった場合、ブラウザに表示されるURLはそのままで、「hoge.html」ではなく「piyo.html」を出力させるサンプルを紹介します。
ルートディレクトリに以下を記述した「.htaccess」を設置します。
RewriteEngine On
RewriteRule ^hoge\.html$ piyo.html [L]
解説
「http://○○○.com/hoge.html」にアクセスがあった場合、RewriteRuleには「hoge.html」が渡ります(「/hoge.html」ではない)。
そしてパターン「^hoge\.html$」とマッチするか確認します(「^」は行頭、「$」は行末、「\」はエスケープを表す正規表現)。
この場合、マッチするので「hoge.html」は置換対象である「piyo.html」に置換されます。
すなわち、出力されるファイルは「/var/www/html/○○○/test/hoge.html」から「/var/www/html/○○○/test/piyo.html」になります(ブラウザに表示されるURLは「http://○○○.com/hoge.html」のまま)。
なお、「[L]」は、ここでURL書き換え処理を中止させ、それ以降は書き換えを行わないようにするフラグです。
RewriteRuleを複数記述する場合の処理の流れ
例えば、mod_rewriteをこのように設定しているとします。
RewriteEngine On
RewriteRule パターンA 置換対象A
RewriteRule パターンB 置換対象B
RewriteRule パターンC 置換対象C
アクセスがあった場合、サーバーから渡されたURLがパターンAとマッチするか確認されます。ここではマッチしたとすると置換Aが行われます。
その次に置換AされたURLがパターンBとマッチするか確認されます。ここではマッチしなかったとすると置換Bは行われません。
置換Bは行われなかったので、URLは置換Aされたものです。そしてこれがパターンCとマッチするか確認されます。
このように上から順番にRewriteRuleが処理されていき、それ以上書き換えできなくなったとき、そこでURL書き換え処理は終了します。
なお、「.htaccess」で複数のRewriteRuleを用いる場合は特殊な挙動となります。詳しくは「.htaccess」での設定時の注意点を参照してください。
Warning: count(): Parameter must be an array or an object that implements Countable in /home/yskymk/www/000web/ysklog/mod-rewrite/wp-includes/class-wp-comment-query.php on line 405
コメント
2:管理人:2014/11/05 19:15:04
>リライトルールでURLの先頭からすべての文字列を取得しているのに$1には http://example.com/ までが含まれていない、ということになるように思えます。
RewriteRuleでは「URLの先頭からすべての文字列」を取得していません。ドメイン部分を除いたものを取得しています。
例えば、「http://○○○.com/hoge.html」でアクセスがあった場合、RewriteRuleのパターン部分には「hoge.html」が渡ります。
「http://www.○○○.com/piyo.html」でアクセスがあった場合、RewriteRuleのパターン部分には「piyo.html」が渡ります。
そのため
>「わたってきたURL」がREQUEST_URIから先頭の/を取り除いたものとまったく同じだということですか?
はイエスとなります。
1:名無しさん:2014/11/02 22:16:46
こんばんは。
質問させていただきたいのですが、次のようなwwwありなしの統一
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule ^(.*) http://example.com/$1 [R=301,L]
において、例えば http://www.example.com/a/1.html にアクセスしても正常に動作しますが、リライトルールでURLの先頭からすべての文字列を取得しているのに$1には http://example.com/ までが含まれていない、ということになるように思えます。これは
書式
RewriteRule パターン 置換対象
・「パターン」は、わたってきたURLとマッチさせる部分です。
における、「わたってきたURL」がREQUEST_URIから先頭の/を取り除いたものとまったく同じだということですか?