複数ドメインを単体の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から取ってました・・。
しばらくこんな感じで運用してみます。
もっと簡単な方法あったら、教えてほすぃ。