如何将Yesod配置为仅在本地主机上监听?

时间:2020-10-10 14:37:24

标签: haskell yesod

我使用的是最小模板,仅找到更改端口的位置:

main :: IO ()
main = warp 3000 App

但是我不知道在哪里设置其他任何内容。在App中,路由生成过程中发生了一些神奇的事情,但是没有任何配置的提示。

根据lsof -i,Yesod正在侦听所有我不想要的接口。我只想将其限制为回送(127.0.0.1)。


我想出了一种变通办法,可以在任何处理程序(路由)的顶部使用它来检查客户端的IP是否匹配:

onlyAllowedFromLocalhost :: Handler ()
onlyAllowedFromLocalhost = do
  let allowedIp = "127.0.0.1"
  host <- waiRequest <&> W.remoteHost <&> tshow
  unless (T.isPrefixOf (allowedIp <> ":") host) $
    sendResponseStatus forbidden403 ("Access is allowed only from " <> allowedIp)

有关正确的解决方案,请参见snak的答案

1 个答案:

答案 0 :(得分:1)

您可以使用Application将站点转换为toWaiApp,而不是使用warp便捷方法,然后使用runSettings来运行它。现在,将Settings配置为使用setHost仅绑定回送,并将其传递给runSettings