与主机名无关的Yesod应用程序

dfl*_*str 6 haskell vhosts yesod

这是一个非常简单的问题:如何运行可以同时处理多个主机的Yesod应用程序?

默认的Yesod设置可以处理来自任何主机的传入连接,但所有URL都会approot在它们前面进行渲染.joinPath如果存在一种存储当前域的方式以便该函数可用,那么覆盖Yesod实例声明是可能的,但是没有.

这个维基页面上描述的方法有效,但是非常hackish,因为它强制路由采取额外的domain参数(因为我没有一组静态的域匹配).出于实际目的(因为我有很多路由,其中​​一些是与域无关的),最好有一个解决方案使路由不受影响,因为仍然可以从WAI请求信息中获取主机名.处理函数.

我使用需要绝对URL的东西(例如电子邮件,RSS,XML API),因此approot _ = ""不是一种选择.

我不能也不能在编译时知道需要支持的所有主机名.

那么,如何呈现URL以便它们使用传入请求的主机名,而不是approot变量?

Mic*_*man 3

一种方法是在基础类型中包含实际的域名,并使用中间件根据请求分配给适当的应用程序,并根据需要生成新的应用程序。然而,这感觉太沉重了。

我想保持 approot 不变,因为它适合一般情况,但也许我们可以添加一个额外的方法 approotRequest ,它也会被赋予值Request。我想将此讨论移至列表中。

更新:更改已登陆 Git:https://github.com/yesodweb/yesod/commit/4dd9880389e3b61f976e44525ae97831ec578a17