如何从 http referer 对主机进行分组

How to group host from http referer

如何对相同名称但不同的顶级域名进行分组。

例如google.com、google.co.id、google.co.jp等

我想将所有 google.* 分组为 google

这是我从 http referer.

获取主机的代码
if (isset($_SERVER["HTTP_REFERER"])) {
    $referal = $_SERVER["HTTP_REFERER"];
    $host_referal = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
}
else {
    $referal = "Unknown";
}

只是在这里吐槽,我没有考虑任何边缘情况。

代码:(Demo)

$referers=['https://google.com','https://www.google.co.id','http://www.google.co.jp'];  // $_SERVER['HTTP_REFERER']
foreach($referers as $referer){
    if(!$referer || !$host=parse_url($referer,PHP_URL_HOST)){  // sometimes $_SERVER['HTTP_REFERER'] is not delivered
        echo "couldn't parse missing/malformed url";
    }else{
        echo preg_match('~(?:https?://)?(?:www\.)?\K[^.]+~',$host,$out)?$out[0]:'';
        echo "\n";
    }
}

输出:

google
google
google

如果这个中断,请提供中断输入字符串,以便我调整我的方法。


p.s。事实是,您可能只需调用即可逃脱:

$referal=preg_match('~^(?:https?://)?(?:www\.)?\K[^.]+~',$_SERVER["HTTP_REFERER"],$out)?$out[0]:'Unknown'

但是 Whosebug 上有许多帖子指出此值不安全,因此使用 parse_url() 可以让您更加安心。