cloudflare / cf-ip-rewrite
库用于将CloudFlare IP地址重写为最终用户IP地址
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: ^4.8
- squizlabs/php_codesniffer: 2.*
This package is not auto-updated.
Last update: 2024-09-14 17:31:53 UTC
README
此模块使开发者能够在应用层轻松地将CloudFlare IP地址重写为实际最终用户IP地址。建议如果可能的话,安装Apache的mod_cloudflare模块或使用nginx重写规则(https://support.cloudflare.com/hc/en-us/articles/200170706-Does-CloudFlare-have-an-IP-module-for-Nginx-)。
对于无法保证通过这些替代方法之一重写IP的情况,可以使用此模块来重写IP地址。
工作原理
$ipRewrite = new CloudFlare\IpRewrite(); $is_cf = $ipRewrite->isCloudFlare(); $rewritten_ip = $ipRewrite->getRewrittenIP(); $original_ip = $ipRewrite->getOriginalIP();
类公开了三个交互方法和一个构造函数。
初始化IpRewrite()
对象将尝试重写IP。如果IP被重写,$_SERVER["REMOTE_ADDR"]
将被更新以反映最终用户的IP地址。
isCloudFlare();
如果请求中存在CF_CONNECTING_IP
头且请求源自Cloudflare IP,则返回true
。
getRewrittenIP()
如果发生重写,则返回重写的IP地址,否则将返回null
。
getOriginalIP()
返回从$_SERVER["REMOTE_ADDR"]
保存的原始IP地址。
最佳实践
// Initialize object to rewrite the headers try { $ipRewrite = new CloudFlare\IpRewrite(); } catch (RuntimeException $e) { // PHP configurations does not support IPv6 } // Check if the request is from Cloudflare $is_cf = $ipRewrite->isCloudFlare(); if ($is_cf) { // Get original or rewritten ip // Order does not matter ... $rewritten_ip = $ipRewrite->getRewrittenIP(); ... $original_ip = $ipRewrite->getOriginalIP(); ... }
注意
重写操作仅在构造函数中触发一次。如果多次调用getRewrittenIP()
或getOriginalIP()
,则无论第一次调用后是否发生更改,它都将返回第一个结果。因为重写操作没有被触发。
要获取最新更改,应使用新的IpRewrite
对象。
测试此模块
此模块包含一组可以使用phpunit运行的测试。要运行测试,请在包上运行composer install
,然后运行以下命令之一
基本测试
composer test
在coverage
文件夹中包含代码覆盖率报告
vendor/bin/phpunit -c phpunit.xml.dist --coverage-html coverage