PHP自定义函数获取搜索引擎来源关键字的方法
在Web开发中,通过分析用户的访问来源(Referrer)来统计来自不同搜索引擎的关键词是一种常见的数据收集方式。本文将介绍如何使用PHP编写一个函数,从HTTP_REFERER中提取并解码具体的搜索关键词,兼容主流搜索引擎如百度、搜狗和360搜索。
实现原理
不同搜索引擎在搜索结果页面使用不同的URL参数名来传递用户的搜索词,且通常采用特定的编码格式。要实现准确提取,核心逻辑包括三个步骤:
- 域名映射:建立搜索引擎主机名(Host)与对应查询参数名的映射关系。
- 参数解析:利用内置函数解析URL中的查询字符串,并根据映射获取原始值。
- 编码转换:对提取到的字符串进行字符集检测与转码,确保输出为UTF-8格式。
核心函数代码
以下函数封装了上述逻辑,使用时需确保服务器环境变量 _SERVER["HTTP_REFERER"] 存在且有效。
function getKeywords() {
// 1. 定义搜索引擎域名与查询参数名的映射表
static $host_keyword_map = array(
'www.baidu.com' => 'wd',
'v.baidu.com' => 'word',
'image.baidu.com' => 'word',
'news.baidu.com' => 'word',
'www.so.com' => 'q',
'video.so.com' => 'q',
'image.so.com' => 'q',
'news.so.com' => 'q',
'www.sogou.com' => 'query',
'pic.sogou.com' => 'query',
'v.sogou.com' => 'query',
);
// 检查是否存在 Referer 头
if (!isset($_SERVER['HTTP_REFERER'])) {
return '';
}
// 解析 URL 结构
$urls = parse_url($_SERVER['HTTP_REFERER']);
// 验证域名是否在映射表中
if (!array_key_exists($urls['host'], $host_keyword_map)) {
return '';
}
// 获取该搜索引擎对应的参数键名
$key = $host_keyword_map[$urls['host']];
// 检查 URL 是否包含查询字符串
if (!isset($urls['query'])) {
return '';
}
// 解析查询字符串为数组
$params = array();
parse_str($urls['query'], $params);
// 确保参数存在于解析结果中
if (!isset($params[$key])) {
return '';
}
// 获取原始关键词
$keywords = $params[$key];
// 编码处理:检测当前编码并转换为 UTF-8
// 注意:mb_detect_encoding 仅做检测,实际转码依赖 iconv
$encoding = mb_detect_encoding($keywords, 'utf-8,gbk');
if ($encoding != 'utf-8') {
$keywords = iconv($encoding, 'utf-8', $keywords);
}
return $keywords;
}
测试用例演示
为了验证函数的有效性,我们可以构造包含不同搜索引擎特征的模拟 HTTP_REFERER 地址进行测试。以下是完整的PHP测试脚本示例:
<?php
header("Content-Type: text/html; charset=utf-8");
// 假设上面定义了 getKeywords() 函数
$referers = array(
// 百度搜索 - 常规搜索
'http://www.baidu.com/s?cl=3&wd=%B9%E9%C0%B4&fr=vid1000',
// 百度搜索 - hao123跳转链接
'http://www.baidu.com/link?url=TIn9NR6fwiy6IwwkCcVF8HhHoxVUpHQsyj1YdlQPy2roXKTnSQS_3UxwvyjZ2JPkpxF8-diSoRCSpODUM_jq2K&wd=%E5%BD%92%E6%9D%A5&tn=baidu&ie=utf-8',
// 百度图片搜索
'http://image.baidu.com/i?ct=503316480&z=&tn=baiduimagedetail&word=%E5%BD%92%E6%9D%A5',
// 360搜索 (so.com)
'http://www.so.com/s?ie=utf-8&q=%E5%BD%92%E6%9D%A5',
// 搜狗搜索
'http://www.sogou.com/web?query=%E5%BD%92%E6%9D%A5'
);
foreach ($referers as $r) {
$_SERVER['HTTP_REFERER'] = $r;
echo "来源: " . $r . " -> 提取关键词: " . getKeywords() . "\n";
}
?
注意事项
- Referer 安全性:
HTTP_REFERER由浏览器发送,用户可以伪造或禁用,因此不宜作为严格的安全校验依据,主要用于统计分析。 - 第三方工具条影响:部分浏览器插件或安全软件会修改或屏蔽 Referer 头,导致无法获取正确的来源信息。
- 编码兼容性:老版本的 PHP 可能需要开启 mbstring 和 iconv 扩展;新版 PHP (7+) 中对于非 UTF-8 字符串的处理需格外小心。
以上就是PHP自定义函数获取搜索引擎来源关键字的详细内容,更多关于PHP网络编程技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









