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