美文网首页
PHP 扩展 - 获取当前请求 IP 地址

PHP 扩展 - 获取当前请求 IP 地址

作者: Bun_Wong | 来源:发表于2016-07-05 23:27 被阅读330次

在 PHP 中获取 IP 地址通常都是来自 $_SERVER 全局变量中,比如

$_SERVER['HTTP_CLIENT_IP'];
// OR
$_SERVER['HTTP_X_FORWARDED_FOR'];
// OR
$_SERVER['HTTP_X_REAL_IP'];  // 更多自定义的 key
// OR
$_SERVER['REMOTE_ADDR'];

也有可能在被前端 Web server 或 load balance 附加到请求头上,如 nginx 中可能设置了

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

根据上面的逻辑,我简单实现了如下的一个方法

// azalea.h
PHP_FUNCTION(azalea_ip);
// azalea.c

/* {{{ azalea_getmodel
 */
PHP_FUNCTION(azalea_ip)
{
    zval *server, *field;
    zend_string *ip = NULL;

    server = zend_hash_str_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER") - 1);
    if (Z_TYPE_P(server) == IS_ARRAY) {
        if ((field= zend_hash_str_find(Z_ARRVAL_P(server), "HTTP_CLIENT_IP", sizeof("HTTP_CLIENT_IP") - 1)) &&
                Z_TYPE_P(field) == IS_STRING) {
            ip = Z_STR_P(field);
        } else if ((field = zend_hash_str_find(Z_ARRVAL_P(server), "HTTP_X_FORWARDED_FOR", sizeof("HTTP_X_FORWARDED_FOR") - 1)) &&
                Z_TYPE_P(field) == IS_STRING) {
            ip = Z_STR_P(field);
        } else if ((field = zend_hash_str_find(Z_ARRVAL_P(server), "REMOTE_ADDR", sizeof("REMOTE_ADDR") - 1)) &&
                Z_TYPE_P(field) == IS_STRING) {
            ip = Z_STR_P(field);
        }
    }
    if (ip) {
        zend_string_copy(ip);
    } else {
        ip = zend_string_init("0.0.0.0", sizeof("0.0.0.0") - 1, 0);  // 默认值
    }
    RETURN_STR(ip);
}
/* }}} */

当然了,PHP 通过 $_SERVER 甚至 request header 来获取 IP 都不是绝对靠谱的方法,还得看架构和运行环境。

相关文章

  • PHP 扩展 - 获取当前请求 IP 地址

    在 PHP 中获取 IP 地址通常都是来自 $_SERVER 全局变量中,比如 也有可能在被前端 Web serv...

  • 接口地址

    1、产看请求头 2、暗网地址 3、查询当前地区 4、根据ip 获取当前地区

  • Linux 中取出当前主机的IP地址

      在Shell获取当前主机ip地址:获取主机IP地址一般是从ifconfig中获取ip地址,此方法只适合Cent...

  • PHP获取当前ip

    有时候我们开发的过程中,我们会用到当前网络地址的ip地址,比如无登录的官网留言,如果不做限制的话,客户或者黑客随时...

  • swift3 获取 wifi ip 地址

    一、获取当前连接的wifi网络获取IP地址 二、根据URL域名从DNS Query获取域名IP地址 共勉。

  • PHP 获取ip地址的六种方法

    PHP 获取ip地址的六种方法

  • 从 URL 输入到页面展现发生了什么

    1.浏览器获取URL,通过DNS服务把URL转换成IP地址 2.IP地址对应的webserver获取请求,将请求转...

  • Java获取当前电脑公网IP地址

    思路:利用 IP地址查询的网站 获取当前电脑的公网IP地址 获取公网IP的几个方法(提供多个,实现错误重试) 综合...

  • 安卓手机获取IP地址

    安卓手机获取IP地址有两种方法: 一、请求获取IP地址的接口 许多获取IP地址的网站都有这个功能,例如我项目中用到...

  • laravel 小技巧

    获取上次请求地址 当前地址 获取包含请求字符串的当前 URL... 带访问有效期的URL地址,可用于扫码支付场景 ...

网友评论

      本文标题:PHP 扩展 - 获取当前请求 IP 地址

      本文链接:https://www.haomeiwen.com/subject/kpfkjttx.html