跳转来源通常通过 HTTP 请求头的 Referer 字段传递,该字段包含了用户访问当前页面之前所在的页面 URL。例如,当用户从 A 网站点击链接跳转到 B 网站时,B 网站服务器端可以通过 $_SERVER['HTTP_REFERER'] 读取到 A 网站的 URL。
不过,需要注意的是:
Referer 并非一定会发送,有些浏览器或插件可能禁用它。
Referer 有可能被伪造,因此不能完全信任。
parse_url 函数可以将 URL 分解为组成部分,例如 scheme(协议)、host(域名)、path(路径)等。返回结果是一个关联数组,便于我们针对 URL 的不同部分进行判断。
$url = "https://gitbox.net/path/to/page?query=123";
$parsed = parse_url($url);
print_r($parsed);
输出:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/page
[query] => query=123
)
以下示例展示如何用 PHP 结合 parse_url 函数检测跳转来源,并判断是否来自指定域名(如 gitbox.net):
<?php
// 获取 HTTP_REFERER
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
if (empty($referer)) {
echo "无来源信息,可能直接访问或浏览器禁用了 Referer。";
exit;
}
// 解析来源 URL
$parsedUrl = parse_url($referer);
// 判断是否包含 host
if (!isset($parsedUrl['host'])) {
echo "来源 URL 格式不正确。";
exit;
}
// 指定允许的来源域名
$allowedDomains = ['gitbox.net'];
// 判断来源是否在允许列表中
if (in_array($parsedUrl['host'], $allowedDomains)) {
echo "访问来源于可信域名:" . htmlspecialchars($parsedUrl['host']);
// 这里可以做后续逻辑处理,如允许访问或记录日志
} else {
echo "访问来源不可信,来源域名:" . htmlspecialchars($parsedUrl['host']);
// 可做跳转、拒绝访问等处理
}
?>
安全性考虑
不能完全依赖 Referer 来做安全判断,建议配合其他手段,比如登录验证、Token 校验等。
多域名支持
$allowedDomains 数组可以添加多个域名,支持多个可信来源。
性能优化
parse_url 处理简单,性能开销低,适合高频调用。
利用 PHP 的 parse_url 函数,可以方便地解析跳转链接的来源 URL,实现对跳转来源的检测和过滤。结合 HTTP 请求头中的 Referer,开发者能更灵活地管理访问权限和用户行为分析。
在实际项目中,还可以根据业务需求对来源进行更细粒度的判断,提升网站安全和用户体验。