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

时间:2012-02-07 22:23:24

标签: haskell vhosts yesod

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

默认的Yesod设置可以处理来自任何主机的传入连接,但所有URL都会以approot为前缀呈现。如果有一种方法可以存储当前域以使其可用于该函数,那么在Yesod实例声明中覆盖joinPath是可能的,但是没有。

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

我使用需要绝对网址的内容(例如电子邮件,RSS,XML API),因此approot _ = ""不是选项。

我没有,也无法在编译时知道所有需要支持的主机名。

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

1 个答案:

答案 0 :(得分:3)

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

我希望保持原样,因为它符合一般情况,但也许我们可以添加一个额外的方法approotRequest,它也将被赋予Request值。我想把这个讨论移到列表中。

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