スポンサードリンク

【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

コメント

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から先頭の/を取り除いたものとまったく同じだということですか?

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から先頭の/を取り除いたものとまったく同じだということですか?
はイエスとなります。

コメントフォーム
お名前
コメント