PHP自定义函数获取搜索引擎来源关键字的方法

阿麦
阿麦
发布时间:2026-10-13| 2人浏览过
原创

在Web开发中,通过分析用户的访问来源(Referrer)来统计来自不同搜索引擎的关键词是一种常见的数据收集方式。本文将介绍如何使用PHP编写一个函数,从HTTP_REFERER中提取并解码具体的搜索关键词,兼容主流搜索引擎如百度、搜狗和360搜索。

实现原理

不同搜索引擎在搜索结果页面使用不同的URL参数名来传递用户的搜索词,且通常采用特定的编码格式。要实现准确提取,核心逻辑包括三个步骤:

  1. 域名映射:建立搜索引擎主机名(Host)与对应查询参数名的映射关系。
  2. 参数解析:利用内置函数解析URL中的查询字符串,并根据映射获取原始值。
  3. 编码转换:对提取到的字符串进行字符集检测与转码,确保输出为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网络编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。