nginx代理转发和stream_socket_get_name

时间:2018-09-05 07:59:27

标签: php nginx websocket

如何使stream_socket_get_name返回远程客户端的真实IP地址?

$ip = stream_socket_get_name($socket, true);

上面的返回类似127.0.0.1:39872

nginx

server {
    listen 8443 ssl;
    server_name  websocket.example.com;

    ssl_certificate  /var/ini/ssl/public.crt;
    ssl_certificate_key  /var/ini/ssl/private.key;

    location / {
        proxy_redirect  off;

        proxy_pass  http://127.0.0.1:9000/;
        proxy_http_version  1.1;
        proxy_set_header  Upgrade $http_upgrade;
        proxy_set_header  Connection "upgrade";
        proxy_read_timeout  300;

        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-Proto https;
        proxy_set_header  X-Forwarded-For $remote_addr;
        proxy_set_header  X-Forwarded-Host $remote_addr;
    }
}

1 个答案:

答案 0 :(得分:0)

问题是stream_socket_get_name()在文件句柄上运行。在这种情况下,文件句柄始终连接到您的代理,因此您只能获取代理信息。但是您看到那些proxy_set_header指令吗?这些就是远程IP和远程端口可以传入的方式。在您的PHP中,您必须检查标头的值。