yuu_nkjm blog
2010-05-17(Mon) 編集
[Apache][.htaccess] DocumentRootを指し示すURLにアクセスがあったときに,mod_rewriteを使ってDocumentRootに含まれる別ディレクトリのコンテンツを表示させたい
DocumentRoot(ドキュメントルート)を指し示すURLにアクセスがあったときに,mod_rewriteを使ってDocumentRootに含まれる別ディレクトリの下のコンテンツを表示させたいと思った.
URLと違うディレクトリにアクセスさせる(http://yuu.nkjm.info/hoge/へのアクセスをhttp://yuu.nkjm.info/diary/にするとかね)ことは,DocumentRootそのものじゃないときは,Aliasやシンボリックを使ってなんとかしてきた.「だけど,DocumentRootそのものへのアクセスをDocumentRootに含まれる別ディレクトリに変えたいときはどうすりゃいいんだろ?適当にやると再帰しちゃわね?」と思い色々やってみた.
ちなみになんでこんな事がしたいのかというと,http://yuu.nkjm.info/でtdiaryにアクセスさせたいんだけど,tdiaryを/var/www/htmlにインストールすると,/var/www/htmlがごちゃごちゃしちゃって嫌だ.なので,/var/www/html/tdiary/にtdiaryをインストールするんだけど,http://yuu.nkjm.info/でアクセスさせたいと言うこと.
/var/www/html (httpd.confでyuu.nkjm.infoのDocumentRootに設定されていると仮定) | |--- diary |--- hoge |--- subhoge |--- fuga
上の様なディレクトリ構成で,/var/www/htmlがhttp://yuu.nkjm.info/のドキュメントルートだったとき,/var/www/htmlに以下の.htaccessを置くと,http://yuu.nkjm.info/へのアクセスがhttp://yuu.nkjm.info/diary/へのアクセスに置き換わる.またこの時,ブラウザのURL欄は変わることはない(i.e. http://yuu.nkjm.info/と表示される).
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が転送先のものになったりする.
DocumentRootじゃないときの例
単にAliasやシンボリックリンクでどうとでもなりそうな気がするけど,メモ.
例1) .htaccessをDocumentRoot(/var/www/html)に置く
http://yuu.nkjm.info/foo/にアクセスがあったとき,/var/www/html/hoge/subhogeのデータを表示させる.
RewriteEngine on
RewriteBase /
RewriteRule ^foo/$ hoge/subhoge/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^foo/(.+)$ hoge/subhoge/$1 [L]
- URLからディレクトリ構成へ http://yuu.nkjm.info/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://yuu.nkjm.info/hoge/にアクセスがあったとき,/var/www/html/hoge/subhogeのデータを表示させる.
RewriteEngine on
RewriteBase hoge/
RewriteRule ^$ subhoge/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ subhoge/$1 [L]
http://yuu.nkjm.info/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/"
参考ページ
-
技術/Apache/mod_rewrieメモ(1):RewriteBaseの誤解 - Glamenv-Septzen.net
「自信ない…」とのことだが「mod_rewriteの内部処理のイメージ」を参考にさせていただいた.これが正しいかは分からないが,上記のテストをする範囲では納得のいく説明だった. -
mod_rewritの基本を再確認 - noopな日々
より複雑な設定が必要な時に参考になりそうだった. - Gyazo - e05b54baa654af685ab711adb2ed1a84
- Gyazo - a6836229ea1b406451ed6805ca75443b
- Gyazo - 011e70a2f063c3b783302a6757846916
- (cache) サーバー構築の覚書 » DocumentRootを指し示すURLにアクセスがあったときに,mod_rewriteを使ってDocumentRootに含まれる別ディレクトリのコンテンツを表示させたい