我在Apache 2.4.18
上使用mod_proxy_wstunnel
。因此,所有请求都从
wss://url.com ==> ws://10.22.22.12:12345
在 WebSocket 服务器代码中,我使用了
socket_getpeername($client, $clientIP);
echo $clientIP;
获取客户端 IP 地址 但是,IP 总是出乎意料的,它显示服务器的 IP,即:10.22.22.12
它无需代理即可正常工作。那么,有没有办法在使用mod_proxy_wstunnel
时获取客户端的 IP 而不是服务器的 IP ?
查看 websocket 连接的标头后,我找到了以下字符串。
GET / HTTP/1.1
Host: 145.24.35.40:12345
Pragma: no-cache
Cache-Control: no-cache
Origin: https://www.domain.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,id;q=0.6
Cookie: __zlcmid=Y7fAKwRoP7ssZA; _ga=GA1.2.259560791.1452107273
Sec-WebSocket-Key: w8Mp2n2lp6R5vnYaeEWsPw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
X-Forwarded-For: 22.22.22.22 <<=== Your IP
X-Forwarded-Host: ws.domain.com
X-Forwarded-Server: ws.domain.com
Upgrade: WebSocket
Connection: Upgrade
X-Forwarded-For
包含我一直在寻找的内容。 但我不确定这是否是实现目标的正确方法。我会努力的,直到有更好的解决方案。