当使用run
运行warp应用程序时,它监听所有IP地址。使用变形监听特定主机
出于安全原因,我只想收听localhost
,使用反向代理处理远程访问。
我该如何拨打run
才能在特定主机/ IP上收听?
注意:这个问题故意显示没有研究工作,因为它被回答Q & A-样式。
当使用run
运行warp应用程序时,它监听所有IP地址。使用变形监听特定主机
出于安全原因,我只想收听localhost
,使用反向代理处理远程访问。
我该如何拨打run
才能在特定主机/ IP上收听?
注意:这个问题故意显示没有研究工作,因为它被回答Q & A-样式。
目前接受的答案因导管和/或变形的变化而中断。扭曲不再输出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!"
run
本身不能这样做。您需要使用runSettings
:
要传递它的Settings
参数包含有关它所监听的主机的信息。
这里的相关类型是HostPreference
。虽然它允许您指定不同的通配符,包括IPv6Only
,但我们将在这里使用Host
构造函数。
基于this answer,我将展示一个只在本地主机上侦听的最小示例。
请注意,类似settingsHost
的访问器被标记为不推荐使用,但经编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!"
请解释downvote,只是downvoting这不会使任何更好的! –
据我所知,'Network.Wai.Handler.Warp'不会导出'Host'构造函数,至少现在不会。 – Ed4
感谢您更新到最新的API!我很久以前更新了自己的代码,但忘记了相应更新我的答案。我会将你的答案标记为已接受! –