複数ドメインを単体のCatalystで運用したいなーって話(5.9版)
5.8までは(https://blog.mitsuto.com/archives/96979)←の方法でできたんですが、5.9から使えなくなったのでなんとかしてみます。
環境は、Catalyst(5.9)+Apache(+fastcgi)な感じです。
サービスイメージとしては、
(仮)ttp://pc.mitsuto.com
(仮)ttp://mobile.mitsuto.com
って感じの複数のサブドメインを単体のCatalystで運用したいなー(もちろん表示されるページは別)ってことです。
まずは、apacheの設定から
<VirtualHost *:80>
ServerName pc.mitsuto.com
DocumentRoot "/home/mitsuto/MyApp/root/pc"
SetEnv service_type pc
AliasMatch ^/(.*) /home/mitsuto/MyApp/script/myapp_fastcgi.pl/$1
</VirtualHost>
<VirtualHost *:80>
ServerName mobile.mitsuto.com
DocumentRoot "/home/mitsuto/MyApp/root/mobile"
SetEnv service_type mobile
AliasMatch ^/(.*) /home/mitsuto/MyApp/script/myapp_fastcgi.pl/$1
</VirtualHost>
とりあえず説明的にはこんな感じ。あとはログとか必要な設定はしとく。
通常と違うのは、SetEnvでservice_type(名前はてきとー)を設定したくらい。
次に、MyApp/lib/MyApp.pmを書き換えます。
MyApp.pmは、
extends 'Catalyst';されているので、あとはCatalyst.pmのメソッドから、
アクセス時に毎回呼ばれて、envが使えて、dispatchされる前のところをてきとーに上書きすればいけそう。
で、色々やった結果、MyApp.pmに下記を追加。場所は、setupの下あたりにでも。
sub prepare_action {
my $c = shift;
if ( $c->req->{'_path'} ) {
$c->req->{'_path'} = $c->engine->env->{'service_type'} . '/' . $c->req->{'_path'};
}
else {
$c->req->{'_path'} = $c->engine->env->{'service_type'};
}
$c->dispatcher->prepare_action( $c, @_ );
}
こんな感じにしとくと、
(仮)ttp://pc.mitsuto.com/のアクセスは、内部的に、/pc (C::Pc.pm)へ、
(仮)ttp://mobile.mitsuto.com/のアクセスは、内部的に、/mobile (C::Mobile.pm)へ飛ぶようになる。
もちろん、ttp://pc.mitsuto.com/bbsであれば、内部的に、/pc/bbsになる。
ま、SetEnvを使わなくても、HTTP_HOSTとかでドメイン見て振り分けてももいいですが。
最初は、$c->engine->env->{‘PATH_INFO’}を上書きしたりとかしてたんですが、
Catalyst::Dispatcher見たら、パスは、$c->reqから取ってました・・。
しばらくこんな感じで運用してみます。
もっと簡単な方法あったら、教えてほすぃ。