Lighttpd + mod_proxy で Catalystに飛ばす時

何も考えずに

$HTTP["host"] == "backend.example.com" {
  proxy.server = ( "" => (("host" => "127.0.0.1", "port" => 3000)))
}

などとしてしまうと、$c->uri_forが http://backend.example.com:3000/ になってしまって都合が悪い。、大抵バックエンドには直接リクエストは送れないからね。
で、こんな時はCatalyst側でusing_frontend_proxy を 1(@see Catalyst::Engine::CGI)にして、X-Forwarded-Hostがbackend.example.comになるようにすれば良い。
ApacheやZeusのmod_proxyは自動的にX-Forwarded-Hostを付けてくれるんだけど、Lighttpd(v1.4.15 あ…もしかしてちょっと古い?)のmod_proxyは自動でやってくれないので、

setenv.add-request-header = ("X-Forwarded-Host" => "ホスト名")

を明示的に書かないとダメ。(@see [Catalyst] Catalyst::Engine::CGI::prepare_path port

なのでCatalystバックエンドにmod_proxyで飛ばす場合は、こうする。

$HTTP["host"] == "backend.example.com" {
  setenv.add-request-header = ("X-Forwarded-Host" => "backend.example.com")
  proxy.server = ( "" => (("host" => "127.0.0.1", "port" => 3000)))
}