PHP 中文域名转码/编码 | 将 Unicode 域名转换为 IDNA ASCII 兼容格式

首先需要安装 Intl 扩展

  1. 如果你服务器装了宝塔面板,相应的 PHP 版本中,安装扩展(不会的自己百度
  2. 如果不是,请自己 Google、Bing、Bing 吧

使用

  1. 对域名编码 | 将 Unicode 域名转换为 IDNA ASCII 兼容格式

    <?php
    //如果你的 PHP版本 大于等于 7.2,必须用这个
    //因为我懒得在 PHP版本 小于 7.2 测试,所以不知道可不可行,行的话用这个
    echo idn_to_ascii('人民网.中国',IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46);
    //输出结果:xn--gmq282eogn.xn--fiqs8s
    
    //如果你的 PHP版本 小于 7.1 用这个
    //PHP 大于等于 7.2 不要用这个!详情看:https://nowtime.cc/php/505.html
    echo idn_to_ascii('人民网.中国');
    //输出结果:xn--gmq282eogn.xn--fiqs8s
  2. 对域名解码 | 将 IDNA ASCII 兼容格式域名 转换为 Unicode 格式域名

    <?php
    //如果你的 PHP版本 大于等于 7.2,必须用这个
    //因为我懒得在 PHP版本 小于 7.2 测试,所以不知道可不可行,行的话用这个
    echo idn_to_utf8('xn--gmq282eogn.xn--fiqs8s',IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46);
    //输出结果:人民网.中国
    
    //如果你的 PHP版本 小于 7.1 用这个
    //PHP 大于等于 7.2 不要用这个!详情看:https://nowtime.cc/php/505.html
    echo idn_to_utf8('xn--gmq282eogn.xn--fiqs8s');
    //输出结果:人民网.中国

PHP 报错:idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated

由于项目的需要,需要对中文域名转码(将 Unicode 域名转换为 IDNA ASCII 兼容格式),Google 查到使用 idn_to_ascii 函数可对中文域名(Unicode 域名)转换为 IDNA ASCII 兼容格式

我在 PHP 7.2.1 下运行 echo idn_to_ascii('人民网.中国'); 出现了一下错误

[root@izwz9a76txemslg5q0e3zaz ~]# php -v
PHP 7.2.11 (cli) (built: Nov  2 2018 09:15:43) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologie

[root@izwz9a76txemslg5q0e3zaz ~]# php -r "echo idn_to_ascii('人民网.中国');"
PHP Deprecated:  idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in Command line code on line 1

Deprecated: idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated in Command line code on line 1

- 阅读剩余部分 -

PHP 判断是否为域名|判断是否为正确格式的域名

PHP 判断是否为域名|判断是否为正确格式的域名

!!!注意这代码判断的是域名,不是 URL!!!

因为项目有需求,首先想到去 Google 搜,翻了几页,未找到能满足自己需求的代码,所以自己动手造了个轮子

要想判断一个域名格式是否正确,得先知道域名是由哪些字符串组成的

Google 查阅了一些资料,得出一下要求

PS:在下述中,“域名” 所指的是,如 nowtime.cc 中的 nowtime

  1. “域名” 只能由 大小写字母数字- 组成
  2. “域名” 不能以 - 开头或结尾
  3. “域名” 每段长度最小 1 位,最长 63 位(不包含 “域名后缀”,以 . 分段)
  4. “域名总长度” 不能超过 255 位(不包含域名后缀;不包含 .

知道要求后,就可以开始造轮子了,然后就有了以下代码:(注意这代码判断的是域名,不是 URL)

- 阅读剩余部分 -

PHP 获取真实用户 IP 地址

PHP 获取用户(客户端)真实 IP(IPv4)

1.当使用了 CDN负载均衡 ...后,导致使用 $_SERVER['REMOTE_ADDR'] 获取不到用户的真实 IP

2. 当用户使用了“匿名代理”,$_SERVER['REMOTE_ADDR'] 将显示代理服务器的IP

因为业务的需要,我们就需要获取用户的真实 IP 进行业务上的操作

<?php
//获取用户真实IP
function getIp() {
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
        $ip = getenv("HTTP_CLIENT_IP");
    else
        if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else
            if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
                $ip = getenv("REMOTE_ADDR");
            else
                if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
                    $ip = $_SERVER['REMOTE_ADDR'];
                else
                    $ip = "unknown";
    return ($ip);
}

echo getIp();//输出真实 IP

获取网站地址栏图标/favicon.ico

favicon 通常是在浏览器中,网页标题前面显示的小图标来代表该网站的图标标记(俗称地址栏图标)。在一些地方(RSS 抓取应用、网站导航)需要显示网站的 favicon 图标,可以使用 Google 的服务来获取[国内可用!!!],获取方式如下:

1. 服务器在国外

API地址:

https://www.google.com/s2/favicons?domain=域名

实例:

如果你想获取 nowtime.cc 的 favicon.ico
那么则访问:https://www.google.com/s2/favicons?domain=nowtime.cc

- 阅读剩余部分 -