虽然过去有一些方法可以获得客户端IP地址(例如req.peerHostname),但我不知道如何在Vapor 3.0中获得它。任何人都可以请让我知道如何获得客户端IP地址在蒸汽3.0?
req.peerHostname
tjrkku2a1#
感谢Vapor社区,我得到了答案。您可以将req.http.remotePeer.hostname用于Vapor 3.0项目。
req.http.remotePeer.hostname
4sup72z82#
嗨,希望这对Vapor 4有帮助,使用这个
func getIp(req: Request) throws -> EventLoopFuture<String> { print(req.headers.forwarded.first!.for) return req.eventLoop.makeSucceededFuture("\(req.headers.forwarded.first!.for ?? "Not found")") }
对我来说很好用,我想不是最好的解决方案,但很有效:)
mzmfm0qo3#
对于Vapor 4,请使用此选项
req.remoteAddress?.ipAddress
nr9pn0ug4#
Vapor 4包括一种确定远程对等体地址的方法,该方法支持使用和不使用代理(负载平衡器)的设置。使用req.peerAddress源代码注解如果负载平衡器或反向代理在头中提供了信息,我们将尝试确定真实的对等地址。从头中获取值的优先级如下:1.尝试“转发”报头(例如,for=192.0.2.60;原始文件=http;乘以=203.0.113.43)1.尝试“X转发的对象”报头(例如,客户端IP、代理1 IP、代理2 IP)1.回退到SwiftNIO提供的套接字远程地址(例如192.0.2.60:62934)在1.和2.中,将使用端口80作为默认端口,3.将具有NIO提供端口号(如果有)请求.swift源代码
req.peerAddress
public var peerAddress: SocketAddress? { if let clientAddress = headers.forwarded.first?.for { return try? SocketAddress.init(ipAddress: clientAddress, port: 80) } if let xForwardedFor = headers.first(name: .xForwardedFor) { return try? SocketAddress.init(ipAddress: xForwardedFor, port: 80) } return self.remoteAddress }
4条答案
按热度按时间tjrkku2a1#
感谢Vapor社区,我得到了答案。
您可以将
req.http.remotePeer.hostname
用于Vapor 3.0项目。4sup72z82#
嗨,希望这对Vapor 4有帮助,使用这个
对我来说很好用,我想不是最好的解决方案,但很有效:)
mzmfm0qo3#
对于Vapor 4,请使用此选项
nr9pn0ug4#
Vapor 4包括一种确定远程对等体地址的方法,该方法支持使用和不使用代理(负载平衡器)的设置。
使用
req.peerAddress
源代码注解
如果负载平衡器或反向代理在头中提供了信息,我们将尝试确定真实的对等地址。从头中获取值的优先级如下:
1.尝试“转发”报头(例如,for=192.0.2.60;原始文件=http;乘以=203.0.113.43)
1.尝试“X转发的对象”报头(例如,客户端IP、代理1 IP、代理2 IP)
1.回退到SwiftNIO提供的套接字远程地址(例如192.0.2.60:62934)
在1.和2.中,将使用端口80作为默认端口,3.将具有NIO提供端口号(如果有)
请求.swift源代码