Haskell YesSOD获取客户端Ipv4/Ipv6地址
我想让用户Haskell YesSOD获取客户端Ipv4/Ipv6地址,haskell,yesod,Haskell,Yesod,我想让用户IPv4和/或IPv6在上使用 如何得到它 -----编辑-------- 比如,如果用户访问我的站点,我想检查他们的IP地址,一旦我得到,我想使用来定位他们 以下示例具有默认的IPv4和IPv6地址: {-# LANGUAGE OverloadedStrings #-} import Data.GeoIP2 import Data.IP (IP(..)) main = do geodb <- openGeoDB "GeoLite2-City.mmdb" let ip
IPv4
和/或IPv6
在上使用
如何得到它
-----编辑--------
比如,如果用户访问我的站点,我想检查他们的IP地址,一旦我得到,我想使用来定位他们
以下示例具有默认的IPv4和IPv6地址:
{-# LANGUAGE OverloadedStrings #-}
import Data.GeoIP2
import Data.IP (IP(..))
main = do
geodb <- openGeoDB "GeoLite2-City.mmdb"
let ip = IPv4 "23.253.242.70"
print $ (findGeoData geodb "en" ip :: Maybe GeoResult)
let ip2 = IPv6 "2001:4800:7817:104:be76:4eff:fe04:f608"
print $ (findGeoData geodb "en" ip2 :: Maybe GeoResult)
{-#语言重载字符串}
导入Data.GeoIP2
导入Data.IP(IP(..)
main=do
geodb这应该有效:
import Network.Wai (remoteHost) -- From the wai package
import Data.IP -- From the iproute package
import Network.Socket.Internal (SockAddr(..)) -- From the network package
sockAddrToIP :: SockAddr -> IP
sockAddrToIP sockAddr = case sockAddr of
SockAddrInet _port hostAddress -> IPv4 $ fromHostAddress hostAddress
SockAddrInet6 _port _flowInfo hostAddress6 _scopeID -> IPv6 $ fromHostAddress6 hostAddress6
-- I don't know how to handle these, they might not apply to the web?
SockAddrUnix _ -> error "Couldn't get IP address"
SockAddrCan _ -> error "Couldn't get IP address"
getHomeR :: Handler Html
getHomeR = do
host <- remoteHost <$> waiRequest
let ip = sockAddrToIP host
traceShowM $ "Remote host is " ++ show host
traceShowM $ "IP is " ++ show ip
-- (Finish implementing the handler here)
事实上,我对网络、IP地址或任何东西都不太了解,但类型排列整齐,代码似乎正常工作。如果有人可以验证是否可以忽略SockAddrUnix
和SockAddrCan
,那就好了。谢谢,但每次我检查它时,总是返回本地主机IP地址127.0.0.1:54575
。所以我最终使用了lookupader“X-Real-IP”
和lookupader“X-Forwarded-For”
。啊,好的。同样,我对这个主题不是非常熟悉,但它看起来像是由nginx或其他反向代理为您的应用程序设置的标题?它来自。我不知道它在keter
上是否有效。我要先检查一下它在那里是否有效。:)
"Remote host is 127.0.0.1:54575"
"IP is 127.0.0.1"