如何配置 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
便捷方法
我使用的是最小模板,只找到更改端口的位置:
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
便捷方法