複数ドメインを単体の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から取ってました・・。

しばらくこんな感じで運用してみます。

もっと簡単な方法あったら、教えてほすぃ。