at posts/single.html

TextDrive でサブドメイン (lighttpd 編)

HUIS TEN BOSCH

hsbtさんの日記より。

.htaccess で小細工対処ではなくてサブドメイン申請したりなんだりしないとダメかなあ

TextDrive のサブドメインの仕組みは少し癖があるんだよね。 詳しくはTextDrive でサブドメインに書いたけど、メインディレクトリの下に作ったディレクトリがサブドメインの置き場になる。

web/public/ ← www.example.com のコンテンツを置く
web/public/diary/ ← diary.example.com のコンテンツを置く

この仕組み、一見すると www.example.com/diary/ と diary.example.com/ で同じコンテンツが見られて Good と思える。 でも、 .htaccess を使って www.example.com/diary/ を diary.example.com/ にリダイレクトしようと考え出すと、とたんに罠にはまる。

  • web/public/diary/ に .htaccess を置く
  • ↑に www から diary のリダイレクトを書く
  • diary でも同じ .htaccess が参照される
  • www と diary を区別するために RewriteCond %{HTTP_HOST} を使う
  • でも何故かうまくいかない ← いまここ

単純に、僕が mod_rewrite の使い方を理解していない可能性もあるけど。 もしかしたら、UseCanonicalName を offにすれば上手くいくのかもしれない。

でも、最近は Apache を使わずに全部 Lighttpd でやればいいんじゃないかと思うようになってきた。

ようやく本題 (lighttpd でサブドメイン on TextDrive)

TextDrive では、自分専用の lighttpd を動かすことができる。 ポート番号は 8765 のように 80 以外になるので、 80 で動いている共用の Apache からプロキシで接続することになる。

まずは、 Apache で受けたリクエストを、すべて lighttpd にリダイレクトさせる。 web/public/.htaccess は以下の通り。

RewriteEngine on
RewriteRule (.*) http://127.0.0.1:8765/$1 [P,L]

次に lighttpd での振り分け方を考える。 そもそも web/public/diary/ を www と diary で共用しているから無理が出てくる。 両者を別のディレクトリに分ければ問題は解決するんじゃないかな。 ってことで、 etc/lighttpd/lighttpd.conf にこう書く。

var.base     = "/users/home/" + server.username
HTTP["host"] =~ "www\.example\.jp" {
 server.document-root        = base + "/web/www.example.jp/public/"
}
HTTP["host"] =~ "diary\.example\.jp" {
 server.document-root        = base + "/web/diary.example.jp/public/"
}

こうすることで、

web/www.example.jp/public/ ← www.example.com のコンテンツを置く
web/diary.example.jp/public/ ← diary.example.com のコンテンツを置く

という構成になる*1

後は、 web/www.example.jp/public/diary/ にアクセスされたら diary 側に飛ばすように書けばいいんじゃないかな。 リダイレクトせずに同じコンテンツを見たいのなら、シンボリックリンクを張ればいい訳だし。

全て lighttpd に飛ばして、 lighttpd 側でサブドメインごとに振り分けるところまでは試した。

注意点として

TextDrive のサーバはたまに再起動するので、 lighttpd が自動的に起動するようにしていた方がいいかも。本家のマニュアルに書いてあった。

関連する日記