独立于主机名的 Yesod 应用程序

Posted

技术标签:

【中文标题】独立于主机名的 Yesod 应用程序【英文标题】:Hostname-independent Yesod application 【发布时间】:2012-02-29 09:24:39 【问题描述】:

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

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

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

我使用需要绝对 URL 的东西(例如电子邮件、RSS、XML API),所以approot _ = "" 不是一个选项。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我将关注讨论,一旦解决方案出现在存储库中,我将不胜感激(对于其他用户)对此答案的更新。谢谢!

以上是关于独立于主机名的 Yesod 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

主机名的有效字符?

如何运行无头的selenium脚本,独立于主机和浏览器

选择具有 yesod 持久性的列子集

Azure应用服务SNI-SSL主机名的重大更改

带有主机名的主页未在实时服务器上的 Django 应用程序中打开

Haskell,Yesod和Keter - 我如何定期(每5分钟)运行一次例行程序?