如何配置 Yesod 只监听本地主机?

How to configure Yesod to only listen on localhost?

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

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)

有关正确的解决方案,请参阅

的答案

您可以将您的站点转换为 Application using toWaiApp, then run it with runSettings. Now, configure Settings to bind only a loopback using setHost 并将其传递给 runSettings

,而不是使用 warp 便捷方法