cloudflare/cf-ip-rewrite

库用于将CloudFlare IP地址重写为最终用户IP地址

1.0.4 2017-10-10 15:44 UTC

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