2017-09-07 3 views
1

私のYesod-ApplicationはEnvoirement-Variableを使って取得する必要があります。 Thisはこの状況を正確に説明しているようです。しかし:その際、唯一のAPPROOTを検討しますイェソドによって生成されたリンクが、Quasiquoter parseRoutesでルート定義は、絶対にとどまる:だからAPPROOT設定Yesod:approseに応じてparseRoutes

mkYesod "App" [parseRoutes| 
/HomeR GET 
|] 

は「domain.com/path」は動作しませんします"/ path"のルートはなく、 "/"のみのルートがあるためです。

このルートに相対的なルートを作成する方法はありますか?


更新:

私は "/ foo" というにAPPROOTを設定した場合、それが動作

instance Yesod Browser where 
    approot = ApprootMaster myApproot 
    cleanPath site s = do 
     if corrected == s 
      then Right $ dropprefix (Data.List.map dropDash s) 
      else Left $ dropprefix corrected 
     where 
     corrected = Data.List.filter (not . Data.Text.null) s 
     dropDash t 
      | Data.Text.all (== '-') t = Data.Text.drop 1 t 
      | otherwise = t 
     r = Data.Text.drop 1 $ myApproot site 
     l = Data.Text.length r 
     dropprefix l 
      | Data.List.take 1 l == [r] = Data.List.drop 1 l 
      | otherwise = l 

...私もそれに応じてcleanPathを変更しようとしましたが、ホーム・ルートへのルートはまだ間違っています"/ foo/foo"にリダイレクトされる "/ foo /"につながる "@ {HomeR}"を除いて...

答えて

1

どの問題に遭遇しているかは完全にはっきりしていません。

  • イェソドによって生成されたURLが/path接頭
  • が含まれます。しかし/path接頭辞を持つ着信要求が正しく解析されません。私はあなたが、あなたは、単にAPPROOTを設定した場合、と言っているものだと思い

この種のプレフィックスの通常の使用例は、アプリの前にリバースプロキシがあることです(アプリにドメインの一部のみを委任しているApacheやNginxなど)。この場合、APPROOTは正常に動作します。

あなたが対処しようとしている他のユースケースについてはわかりませんが、一般的にはcleanPathメソッドをオーバーライドするだけでリクエストパスの一部を削除できます。または、必要に応じてWAIミドルウェアを使用してリクエスト自体を変更することもできます。

+0

はい、そうです。私は2つの異なる場所でアプリケーションを実行したいので、すべてのルートが "/"にある独自のドメインで1回実行し、もう1回はドメインのサブフォルダ内で実行する必要があるためです。 – Nudin

+0

私はcleanPathメソッドをオーバーライドしようとしましたが、正しく処理することはできません。あなたは私にヒントを与えることができますか? – Nudin

+0

これを単一のファイルの例で再現できますか?どのようなエラーが発生しているかは私には明らかではありません。 –

関連する問題