質問: Yesodのアプリケーションで以下のように設定しています。 config/routes ``` / HomeR GET POST ``` config/settings.yml ``` host: "_env:HOST:*4" # any IPv4 host port: "_env:PORT:3000" approot: "_env:APPROOT:somedir/" ``` この状態で "" にアクセスしても HomeR のハンドラが呼ばれません。 yesod のアプリケーションを特定のパスの下で動くようにするにはどのようにすればよいのでしょう。 **追記** リバースプロキシを使用するという提案がありました。 Apacheのmod_proxyで以下のように設定します。 ``` Redirect /somedir /somedir/ ProxyPass /somedir/ http://localhost:3000/ ``` これで `http://localhost/somedir/` にアクセスすると `HomeR` にはアクセスできます。ただしテンプレート内で展開したURLに `/somedir/` が付かないため CSS やすべてのリンクが破綻します。 たとえば以下のようなテンプレートを書きます。 ``` ホーム ``` これは `ホーム` に展開されます。ApprootRelative を使用した場合は `ホーム` です。これではサイトが機能しません。 これを回避するには`config/routes`を解釈する時点で`somedir`を注入するのが適切だと思います。ただし stack のテンプレートを使用したプロジェクトでは`mkYesodData`でルートを構築する時点が環境変数を読むタイミングではなく環境変数にアプリケーションルートのディレクトリを指定して起動するという書き方ができずにいます。 `mkYesodData`を使用せずにルートを構築するか、`mkYesodData`相当のものを実装するか勉強中です。
回答: approotはテンプレートエンジンなどでルート情報を埋め込むために使われます。 yesod単体での解決法ではありませんが、僕はこういう場合、 nginxなどのリバースプロキシを間にはさんで、 `localhost:3333/somedir -> localhost:3000`みたいに設定します。