スポンサードリンク

【mod_rewrite】Alias設定をしている場合のURL書き換え

通常、「http://○○○.com/abc/hoge.html」というURLでアクセスがあった場合、ルートディレクトリにある「abc」ディレクトリの「hoge.html」が出力されます。

しかしサーバーで

Alias /abc "/var/www/html/○○○/def/ghi/"
※「/var/www/html/○○○/」はドメイン「○○○.com」のルートディレクトリとする

というAlias(エイリアス)設定がされている場合、「http://○○○.com/abc/hoge.html」でアクセスがあった場合、URLはそのままで「/def/ghi」ディレクトリにある「hoge.html」が出力されます。

では、「http://○○○.com/abc/hoge.html」でアクセスがあった場合、「/var/www/html/○○○/def/ghi/hoge.html」ではなく「/var/www/html/○○○/def/ghi/piyo.html」が出力されるようにURL書き換えを行う場合はどうすればよいのでしょうか?

スポンサードリンク

課題

「http://○○○.com/abc/hoge.html」でのアクセスで「/var/www/html/○○○/def/ghi/hoge.html」が出力されるAlias設定中に、さらにURLを書き換えて「/var/www/html/○○○/def/ghi/piyo.html」が出力されるようにする。

環境

まず、環境を整理しておきます。

  • ルートディレクトリ
    /var/www/html/○○○/
  • Alias設定
    「/var/www/html/○○○/abc」へのアクセスは「/var/www/html/○○○/def/ghi」に移動させる
  • 「/var/www/html/○○○/def/ghi」に「hoge.html」と「piyo.html」を作成
    /var/www/html/○○○/def/ghi/hoge.html
    /var/www/html/○○○/def/ghi/piyo.html

URL書き換えの方法

方法はいたって簡単で、mod_rewriteの「RewriteBase」を使用します。

すなわち、「def/ghi」ディレクトリに以下を記述した.htaccessをアップロードします。

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

これで、「http://○○○.com/abc/hoge.html」でアクセスがあった場合、URLはそのままで「def/ghi/piyo.html」が出力されます。

書き換えの挙動について

この処理の挙動を追うと、以下のようになっています(自分の中での考えで、間違っているかもしれません)。

【ポイント】

「RewriteBase」の処理段階では、ローカルディレクトリの接頭辞は取り除かれ、残りの部分に書き換えルールが適用されます。 そして書き換え後、取り除かれた部分にディレクトリパスが付加されます。

abc/hoge.html でアクセスがある
   ↓  Alias設定「Alias /abc "/var/www/html/○○○/def/ghi/"」が適用される
def/ghi/hoge.html
   ↓  ディレクトリのパスが取り除かれる
hoge.html
   ↓  RewriteRuleに従ってURLを書き換える
piyo.html
   ↓  RewriteBaseで指定されているディレクトリが付加される
abc/piyo.html
   ↓  Alias設定「Alias /abc /def/ghi」が適用される
def/ghi/piyo.html

上は複雑かつ無駄が多いように感じますが、ディレクトリの書き換えが後から行われるため、仕様上正常な動作です(深刻なオーバーヘッドが伴うように見えますが、実際には大したことはないそうです)。

追記

なお、あれこれ挙動を追っていたら、別の方法も思いついたので整理しておきます。

ルートディレクトリ「/var/www/html/○○○/」に以下を記述した.htaccessをアップロードしてもURL書き換えがうまくいきます。

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

挙動

おそらく、上記方法は以下の挙動になっていると思います。

/abc/hoge.html でアクセスがある
↓  Alias設定「Alias /abc /def/ghi」が適用される
def/ghi/hoge.html(※1)
↓  RewriteRuleに従ってURLを書き換える
def/ghi/piyo.html

※1:httpd.confにRewriteRuleを記述すれば先頭に「/」がつくが、.htaccessに書いた場合はつかない(詳細は「.htaccess」と「httpd.conf」での設定による違いを参照)

これを見ていて気づいたのですが、この方法の方がサーバーにURLを再投入しなくて済むので処理は早いかもしれません。

なお、次の方法ではできませんでした。

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

コメント

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

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