梅雨入りして気分までじめじめしてます。

今日試してたのはPlayで作ったサービスをサブディレクトリレベルで複数配置する方法です。

Play frameworkでサービスを作ると、ApacheをフロントにしてReverseProxyを利用して裏側のNettyで動いてるPlay frameworkのサービスへ転送する、という仕組みになるのが普通だと思います。
そこで、ReverseProxyでディレクトリごとに振ろうとしたらなぜか色々苦労したのでその方法だけメモしておきます。

1.普通にReverseProxyやろうとした

最初は普通に
<VirtualHost *:80>
   ServerName foo.net
   ProxyPreserveHost On
   ProxyPass /bar http://127.0.0.1:9000
   ProxyPassReverse /bar http://127.0.0.1:9000
</VirtualHost>
とかやってみたんです。
ところが、これでfoo.net/bar/ にアクセスすると、なぜかhttp://foo.net/loginにリダイレクトされてしまう。
ログイン認証付きページなので、ログインせずにアクセスすると/loginにリダイレクトする処理を入れていたのですが、まさかこうなるとは。

2.routesいじってみた

ちょっとググったらStackOverflowに「そのサブディレクトリ名付きでroutes書けばいいんでね」みたいな記述があったのでとりあえずroutesの記述を全部"/bar/login"のようにサブディレクトリ付きで記述。

そして、

play compile start
さぁ、これでアクセスできるかな?とfoo.net/bar/にアクセス。すると・・・

404 Not Found

3.で、どういうRequestが送られてるのか調べてみた。

Global.javaのonHandlerNotFound()メソッドを以下のように記述。
public Result onHandlerNotFound(Http.RequestHeader request) {
 Logger.info("not found : "request.uri());
 return notFound(notFound.render());
}
で、ログ見ながらfoo.net/bar/notexistのように存在しないアドレスを叩いてみると・・・
[info] application - not found : /notexist
普通に前部分が消去されるだけで通ってます。

4.これに対応するようroutesとhttpd.confを書き換えてみる

これらを踏まえて、
httpd.conf
<VirtualHost *:80>
   ServerName foo.net
   ProxyPreserveHost On
   ProxyPass /bar http://127.0.0.1:9000/bar
   ProxyPassReverse /bar http://127.0.0.1:9000/bar
</VirtualHost>
routes
GET     /bar/                       controllers.Anonymous.index()
GET     /bar/login                 controllers.Anonymous.initForm()
という感じにすべて書き換え。
これで事なきを得ました。

サブディレクトリ配置の際にはroutesに気を使わないといけないので、要注意ですね。

でもほんとはもっといい方法がありそう・・・