DocumentRoot(ドキュメントルート)を指し示すURLにアクセスがあったときに、mod_rewriteを使ってDocumentRootに含まれる別ディレクトリの下のコンテンツを表示させたいと思った。
URLと違うディレクトリにアクセスさせる(http://network-learning.jp/hoge/へのアクセスをhttp://network-learning.jp/diary/にするとかね)ことは、DocumentRootそのものじゃないときは、Aliasやシンボリックを使ってなんとかしてきた、「だけど、DocumentRootそのものへのアクセスをDocumentRootに含まれる別ディレクトリに変えたいときはどうすりゃいいんだろ?適当にやると再帰しちゃわね?」と思い色々やってみた。
ちなみになんでこんな事がしたいのかというと、http://network-learning.jp/でtdiaryにアクセスさせたいんだけど、tdiaryを/var/www/htmlにインストールすると、/var/www/htmlがごちゃごちゃしちゃって嫌だ、なので、/var/www/html/tdiary/にtdiaryをインストールするんだけど、http://network-learning.jp/でアクセスさせたいと言うこと。
1 2 3 4 5 6 |
/var/www/html (httpd.confでnetwork-learning.netのDocumentRootに設定されていると仮定) | |--- diary |--- hoge |--- subhoge |--- yone |
上の様なディレクトリ構成で、/var/www/htmlがhttp://network-learning.jp/のドキュメントルートだったとき、/var/www/htmlに以下の.htaccessを置くと、http://network-learning.jp/へのアクセスがhttp://network-learning.jp/diary/へのアクセスに置き換わる。またこの時、ブラウザのURL欄は変わることはない(i.e. http://network-learning.jp/と表示される)。
1 2 3 4 5 6 7 8 |
RewriteEngine on RewriteBase / RewriteRule ^$ diary/ [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # !-f は存在するファイル名にはルールを適用しない # !-d は存在するディレクトリ名にはルールを適用しない RewriteRule ^(.+)$ diary/$1 [L] |
このとき注意しなきゃいけないのは、転送先のdiaryにCMSのようなプログラムが置かれていてそいつに設置URLのようなパラメータがあるとき、異なるURLからアクセスするとそれに関する警告がでたり、自動生成で作られるサイト内URLが転送先のものになったりする。
Contents
DocumentRootじゃないときの例
単にAliasやシンボリックリンクでどうとでもなりそうな気がするけど、
例1) .htaccessをDocumentRoot(/var/www/html)に置く
http://network-learning.jp/foo/にアクセスがあったとき、/var/www/html/hoge/subhogeのデータを表示させる。
1 2 3 4 5 6 |
RewriteEngine on RewriteBase / RewriteRule ^foo/$ hoge/subhoge/ [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^foo/(.+)$ hoge/subhoge/$1 [L] |
- URLからディレクトリ構成へ http://network-learning.jp/foo/ →/var/www/html/foo/
- DocumentRootでの分割 “/var/www/html/” + “foo/”
- RewriteRuleでの置きかえ “foo/” → “hoge/subhoge/”
- RwriteBaseを元に戻す “hoge/subhoge/” → “/hoge/subhoge/”
- DocumentRootを元に戻す “/hoge/subhoge/” → “/var/www/html/hoge/subhoge/”
例2) .htaccessをDocumentRootのサブディレクトリ(/var/www/html/hoge)に置く
http://network-learning.jp/hoge/にアクセスがあったとき、/var/www/html/hoge/subhogeのデータを表示させる。
1 2 3 4 5 6 |
RewriteEngine on RewriteBase hoge/ RewriteRule ^$ subhoge/ [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ subhoge/$1 [L] |
http://network-learning.jp/hoge/にアクセスがあると…
- URLからディレクトリ構成へ
http://yuu.nkjm.info/hoge/ →/var/www/html/hoge/ - DocumentRootでの分割
“/var/www/html/” + “hoge/” - RewriteRuleでの置きかえ
“hoge/” → “subhoge/” - RwriteBaseを元に戻す
“subhoge/” → “/hoge/subhoge/” - DocumentRootを元に戻す
“/hoge/subhoge/” → “/var/www/html/hoge/subhoge/”
参考 * mod_rewriteメモ(1):RewriteBaseの誤解