#29 James GPT加强:
/**
* 检查是否为外部链接
*
* @param string $url URL地址
* @return bool 如果是外部链接返回 true,否则返回 false
*/
private function isExternalLink($url)
{
// 如果 URL 为空,返回 false
if (empty($url)) {
return false;
}
// 处理特殊协议
if (preg_match('/^(javascript|mailto|tel|sms|file):/i', $url)) {
return false;
}
// 如果是以 // 开头的协议相对 URL
if (strpos($url, '//') === 0) {
$url = 'http:' . $url;
}
// 获取当前请求的主机名
$currentHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$currentHost = rtrim($currentHost, '/');
// 解析 URL
$urlParts = parse_url($url);
// 如果 URL 无法解析或没有 host 部分(相对路径),认为是内部链接
if ($urlParts === false || empty($urlParts['host'])) {
return false;
}
// 标准化主机名(移除 www. 前缀并转为小写)
$currentHost = strtolower(preg_replace('/^www\./i', '', $currentHost));
$urlHost = strtolower(preg_replace('/^www\./i', '', $urlParts['host']));
// 检查域名是否在允许的内部域名列表中
$internalDomains = [
$currentHost,
// 可以添加其他允许的域名
// 'subdomain.yourdomain.com',
// 'otherdomain.com'
];
return !in_array($urlHost, $internalDomains, true);
}