Yesod:parseRoutes取决于approot

时间:2017-09-07 21:45:51

标签: haskell yesod

我的Yesod-Application应该通过Envoirement-Variable获得它的批准。 This似乎正好描述了这种情况。但是:当这样做时,只有Yesod生成的链接才会考虑该批准,但Quasiquoter parseRoutes中的Route-definitions将保持绝对:

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

所以将APPROOT设置为" domain.com/path"不起作用,因为" / path"但仅适用于" /"。

有没有办法让路线相对于批准?

更新

我也尝试相应地修改cleanPath,但路由到Home-Route仍然是错误的......

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

如果我批准了" / foo"它有效,除了" @ {HomeR}"通往" / foo /"重定向到" / foo / foo" ...

1 个答案:

答案 0 :(得分:2)

目前还不完全清楚你遇到了什么问题。我你说的是什么,如果你只是设置APPROOT,那么:

  • Yesod生成的网址将包含/path前缀
  • 但具有/path前缀的传入请求将无法正确解析

这种前缀的通常用例是您的应用程序前面有一个反向代理,例如Apache或Nginx,它只将部分域委托给您的应用程序。在这种情况下:APPROOT工作正常。

我不确定您尝试解决的其他用例,但一般情况下,您可以通过覆盖cleanPath方法删除部分请求路径。或者,如果需要,您可以使用WAI中间件来修改请求。