

Yesodのアプリケーションで以下のように設定しています。

config/routes

[code]

    / HomeR GET POST
    
[/code]

config/settings.yml

[code]

    host:           "_env:HOST:*4" # any IPv4 host
    port:           "_env:PORT:3000"
    approot:        "_env:APPROOT:somedir/"
    
[/code]

この状態で "<http://localhost:3000/somedir/>" にアクセスしても HomeR のハンドラが呼ばれません。 yesod
のアプリケーションを特定のパスの下で動くようにするにはどのようにすればよいのでしょう。

**追記**  
リバースプロキシを使用するという提案がありました。  
Apacheのmod_proxyで以下のように設定します。

[code]

    Redirect /somedir /somedir/
    ProxyPass /somedir/ http://localhost:3000/
    
[/code]

これで `http://localhost/somedir/` にアクセスすると `HomeR`
にはアクセスできます。ただしテンプレート内で展開したURLに `/somedir/` が付かないため CSS やすべてのリンクが破綻します。

たとえば以下のようなテンプレートを書きます。

[code]

    <a href="@{HomeR}">ホーム</a>
    
[/code]

これは `<a href="http://localhost:3000/">ホーム</a>` に展開されます。ApprootRelative
を使用した場合は `<a href="/">ホーム</a>` です。これではサイトが機能しません。

これを回避するには`config/routes`を解釈する時点で`somedir`を注入するのが適切だと思います。ただし stack
のテンプレートを使用したプロジェクトでは`mkYesodData`でルートを構築する時点が環境変数を読むタイミングではなく環境変数にアプリケーションルートのディレクトリを指定して起動するという書き方ができずにいます。

`mkYesodData`を使用せずにルートを構築するか、`mkYesodData`相当のものを実装するか勉強中です。


CC BY-SA 3.0
2015-12-20T15:40:48.400
20227
2016-04-15T18:41:19.517
2016-02-15T16:50:52.053
2112
2112
question
haskell
yesod で APPROOT で指定したパスがルーティングに反映されない


approotはテンプレートエンジンなどでルート情報を埋め込むために使われます。  
yesod単体での解決法ではありませんが、僕はこういう場合、  
nginxなどのリバースプロキシを間にはさんで、  
`localhost:3333/somedir -> localhost:3000`みたいに設定します。


CC BY-SA 3.0
2016-02-04T03:58:09.167
21686
2016-02-04T03:58:09.167
14269
20227
answer