【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]
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
コメント
まだコメントはありません。