如何将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 的答案

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

最新更新