我的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" ...
答案 0 :(得分:2)
目前还不完全清楚你遇到了什么问题。我想你说的是什么,如果你只是设置APPROOT,那么:
/path
前缀/path
前缀的传入请求将无法正确解析这种前缀的通常用例是您的应用程序前面有一个反向代理,例如Apache或Nginx,它只将部分域委托给您的应用程序。在这种情况下:APPROOT工作正常。
我不确定您尝试解决的其他用例,但一般情况下,您可以通过覆盖cleanPath
方法删除部分请求路径。或者,如果需要,您可以使用WAI中间件来修改请求。