6

当使用 运行warp应用程序时run,它会侦听所有 IP 地址。

出于安全原因,我只想监听localhost,使用反向代理处理远程访问。

我如何需要调用run才能仅监听特定的主机/IP?

注意:这个问题故意显示没有研究工作,因为它是问答式回答的。

4

2 回答 2

6

当前接受的答案因管道和/或扭曲的更改而被打破。Warp 不再导出Host构造函数。但是你不需要它,因为该HostPreference类型支持 OverloadedStrings 扩展,所以你可以直接使用字符串。

setPort此示例还通过切换到和消除了弃用警告setHost

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)

main = do
    let port = 3000
    putStrLn $ "Listening on port " ++ show port
    let settings = setPort port $ setHost "127.0.0.1" defaultSettings
    runSettings settings app

app req = return $
    responseLBS status200 [(hContentType, "text/plain")] "Hello world!"
于 2014-05-05T20:11:10.503 回答
2

run自己做不到。你需要使用runSettings

您要传递给它的Settings参数包含有关它所侦听的主机的信息。

这里的相关类型是HostPreference. 尽管它允许您指定不同的通配符,包括IPv6Only,但我们将在Host此处使用构造函数。

基于这个答案,我将展示一个仅在 localhost 上收听的最小示例。

请注意,访问器 likesettingsHost被标记为已弃用,但 warp 2.1.2.1 的官方文档仍然显示了使用settingsTimeout here的示例。

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)

main = do
    let port = 3000
    putStrLn $ "Listening on port " ++ show port
    let settings = defaultSettings { settingsPort = port,
                                     settingsHost = Host "127.0.0.1" }
    runSettings settings app

app req = return $
    responseLBS status200 [(hContentType, "text/plain")] "Hello world!" 
于 2014-03-24T21:07:27.157 回答