单代码库多站点的域名访问限制与跳转实现及PHP代码咨询
域名访问限制与跳转实现方案
首先修正你原代码的两个关键问题:
elseif语句末尾多了分号,会导致后续代码块不受条件控制$_SERVER['HTTP_REFERER']返回的是完整来源URL(如https://cde.com/article.php),直接判断等于域名会匹配失败,需要先提取域名部分
辅助函数:提取URL中的域名
先写一个工具函数,用来从URL中提取主域名,兼容带协议、路径的情况:
function getDomainFromUrl($url) { // 解析URL $parsedUrl = parse_url($url); if (!isset($parsedUrl['host'])) { return false; } // 返回主机域名(如abc.com、cde.com) return $parsedUrl['host']; }
完整实现代码
<?php function getDomainFromUrl($url) { $parsedUrl = parse_url($url); if (!isset($parsedUrl['host'])) { return false; } return $parsedUrl['host']; } // 获取当前站点的域名 $currentDomain = $_SERVER['HTTP_HOST']; // 获取来源域名 $refererDomain = isset($_SERVER['HTTP_REFERER']) ? getDomainFromUrl($_SERVER['HTTP_REFERER']) : false; // 功能一:限制cde.com访问abc.com(即当当前是abc.com,且来源是cde.com时,拒绝访问) if ($currentDomain === 'abc.com' && $refererDomain === 'cde.com') { // 输出403禁止访问,或直接终止脚本 http_response_code(403); echo '禁止从cde.com访问本站点'; exit; } // 功能二:当来源为cde.com时,跳转至abc.com(即用户从cde.com跳过来时,重定向到abc.com) if ($refererDomain === 'cde.com') { // 使用header函数跳转,注意要在输出任何内容之前调用 header('Location: https://abc.com'); exit; } ?>
代码说明
- 提取域名:通过
parse_url解析URL,获取主机部分,确保能正确识别来源域名 - 访问限制:判断当前站点是abc.com且来源是cde.com时,返回403状态码并终止脚本,阻止访问
- 跳转功能:当检测到来源是cde.com时,使用
header('Location: ...')发送重定向指令,配合exit确保脚本停止执行
注意事项:
$_SERVER['HTTP_REFERER']可能被浏览器或代理隐藏,不能作为唯一的验证依据,若需要更严格的限制,可结合IP或会话验证header函数必须在任何HTML输出之前调用,否则会报错,确保代码放在页面最顶部
内容的提问来源于stack exchange,提问作者Marco Polo
相关产品推荐
相关产品推荐

