スポンサードリンク

【mod_rewrite】 RewriteBaseとは?

ここではApacheのモジュール mod_rewriteのディレクティブの一つ「RewriteBase」について説明しています。

スポンサードリンク

RewriteBaseとは?

「RewriteBase」は、mod_rewriteでのURL書き換えにおいて、ベースとなるディレクトリを明示的に指定するものです(.htaccessで使用します)。

書式

RewriteBase URL上のディレクトリパス

デフォルト(「RewriteBase」を記述しない場合)は現在の物理パスとなります。

※Alias設定をしていないディレクトリかつそのディレクトリ内でmod_rewriteを使う場合は特に「RewriteBase」は記述しなくてもよいです(デフォルトで現在の物理パスとなります)。

使用例

環境

「RewriteBase」の使用例を説明する前に、以下に環境を記述しておきます。

  • ルートディレクトリ
    /var/www/html/○○○/
  • ルートディレクトリに「test」ディレクトリを設置
    /var/www/html/○○○/test/
  • そこに「hoge.html」と「piyo.html」を作成
    /var/www/html/○○○/test/hoge.html
    /var/www/html/○○○/test/piyo.html

「http://○○○.com/test/hoge.html」でアクセスしたとき、通常は「/var/www/html/○○○/test/hoge.html」が表示されますが、URLはそのままで「/var/www/html/○○○/test/piyo.html」が出力される設定を行います。

RewriteBaseの使い方

ルートディレクトリに以下を記述した「.htaccess」を設置すれば、「http://○○○.com/test/hoge.html」でアクセスしたとき、URLはそのままで「/var/www/html/○○○/test/piyo.html」が出力されます。

RewriteEngine On
RewriteBase /test
RewriteRule ^test/hoge\.html$ piyo.html [L]

なお、次の場合はURL書き換えはできません(上記の赤文字部分「test/」がない)。

RewriteEngine On
RewriteBase /test
RewriteRule ^hoge\.html$ piyo.html [L]

これは、RewriteBaseで設定しているディレクトリパスは、RewriteRuleの置換対象(piyo.html)が相対パスの場合に付加されるだけで、RewriteRuleのパターン部分(hoge.html)には無関係だからです。

そのためRewriteRuleのパターン部分を「^hoge\.html$」にしてしまうと、「http://○○○.com/test/hoge.html」でアクセスがあった場合、RewriteRuleには「test/hoge.html」が渡ってくるためパターンマッチしません。

また、次の場合も不可です。

RewriteEngine On
RewriteBase /test
RewriteRule ^/test/hoge\.html$ piyo.html [L]

つまり、「/test/hoge.html」ではなく「test/hoge.html」としなければなりません。

これは、「httpd.conf」での設定では「/test/hoge.html」がわたってきますが、「.htaccess」での設定では先頭のスラッシュがないものがわたってくるのでマッチしなくなります。

「RewriteBase」を使わない方法

上の方法では「RewriteBase」で明示的にディレクトリパスを指定しましたが、次の方法では「RewriteBase」を用いなくてもOKです。

ルートディレクトリに以下を記述した「.htaccess」を設置。

RewriteEngine On
RewriteRule ^test/hoge\.html$ test/piyo.html [L]

なお、「/var/www/html/○○○/test/」に以下を記述した「.htaccess」を設置した場合も「RewriteBase」は不要です。

RewriteEngine on
RewriteRule ^hoge\.html$ piyo.html [L]

RewriteBaseの注意点

ディレクトリに設置した.htaccessでRewriteBaseを使う場合、注意が必要です。

例えば、以下を記述した.htaccessを「test」ディレクトリに設置するとします。

RewriteEngine On
RewriteBase /
RewriteRule ^hoge\.html$ piyo.html [L]

この場合、「http://○○○.com/test/hoge.html」でアクセスがあった場合、「/var/www/html/○○○/test/piyo.html」ではなくルートディレクトリの「/var/www/html/○○○/piyo.html」が出力されます(ファイルがない場合は404エラーとなる)。

これは、RewriteBaseが「ベースとなるディレクトリを明示的に指定するもの」だからです(現在、.htaccessが存在する場所が基準となるのではない)。

この場合、次のようにしなければなりません。

RewriteEngine On
RewriteBase /test
RewriteRule ^hoge\.html$ piyo.html [L]

また、「http://○○○.com/test/hoge.html」でアクセスがあった場合、「/var/www/html/○○○/abcdefg/piyo.html」のファイルを出力したい場合はこのようにします。

RewriteEngine On
RewriteBase /abcdefg
RewriteRule ^hoge\.html$ piyo.html [L]

コメント

まだコメントはありません。

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