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]
  1. URLからディレクトリ構成へ http://yuu.nkjm.info/foo/ →/var/www/html/foo/
  2. DocumentRootでの分割 "/var/www/html/" + "foo/"
  3. RewriteRuleでの置きかえ "foo/" → "hoge/subhoge/"
  4. RwriteBaseを元に戻す "hoge/subhoge/" → "/hoge/subhoge/"
  5. 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/にアクセスがあると…
  1. URLからディレクトリ構成へ
    http://yuu.nkjm.info/hoge/ →/var/www/html/hoge/
  2. DocumentRootでの分割
    "/var/www/html/" + "hoge/"
  3. RewriteRuleでの置きかえ
    "hoge/" → "subhoge/"
  4. RwriteBaseを元に戻す
    "subhoge/" → "/hoge/subhoge/"
  5. DocumentRootを元に戻す
    "/hoge/subhoge/" → "/var/www/html/hoge/subhoge/"

参考ページ


トップ «前の日(05-16) 最新 次の日(05-18)» 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|