使用Cloudflare时HTTP_CF_CONNECTING_IP无法获取访客真实IP咨询
问题排查与解决方法
- 第一步:确认Cloudflare代理状态
首先检查你域名对应DNS记录的云朵状态,必须是*橙色云朵(已代理)*才会传递CF自定义请求头。如果是灰色仅DNS模式,CF不会对你的请求做代理,自然不会携带HTTP_CF_CONNECTING_IP头,你拿到的还是直接访问的IP。 - 第二步:校验请求头是否被服务器过滤
新建一个PHP测试页,输出全部$_SERVER变量确认是否存在HTTP_CF_CONNECTING_IP字段:
如果找不到该字段,说明你的共享服务器默认过滤了CF传递的自定义请求头。可以尝试在<?php var_dump($_SERVER); ?>.htaccess中添加规则保留该头:
配置后依旧不存在的话,需要联系你的主机服务商,要求放开CF相关请求头的传递限制,很多共享主机会默认过滤非标准HTTP头避免安全问题。SetEnvIf HTTP_CF_CONNECTING_IP "^(.*)$" HTTP_CF_CONNECTING_IP=$1 - 第三步:替代验证方案
如果HTTP_CF_CONNECTING_IP确实拿不到,也可以从$_SERVER['HTTP_X_FORWARDED_FOR']取值,该头是CF默认传递的逗号分隔IP列表,最左侧的IP就是访客真实IP,简易写法参考:if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $userip = trim($ips[0]); } else { $userip = $_SERVER['REMOTE_ADDR']; }
补充说明:你当前配置的安全头和IP获取问题完全无关,这部分配置是浏览器端安全规则,不会影响服务器接收CF的请求头。
后续功能跑通后优化安全性的话,只需要增加判断逻辑:只有当REMOTE_ADDR属于Cloudflare公开的官方IP段时,才信任上述两个头的值,避免攻击者伪造请求头窃取权限。
内容的提问来源于stack exchange,提问作者Martin15789
相关产品推荐
相关产品推荐

