PHP 5.6外部链接跳转异常求助:被解析为网站内部路径
解决URL跳转变成相对路径的问题
你遇到的这个问题我之前也碰到过——本质就是用户提交的网址缺少协议头(http/https),浏览器会默认把它当成当前域名下的相对路径,所以才会跳转到www.mydomain.com/www.google.com这种奇怪的地址。只判断www开头的方案确实太局限了,毕竟现在很多网站不用www前缀,比如github.com、baidu.com,甚至是各种二级域名,都会被漏掉。
给你一个通用的解决方案:先检测网址是否已经包含了协议头,如果没有就自动补上https://(优先用HTTPS,更安全),这样不管用户输入的是www.google.com、google.com还是blog.example.com,都能正确跳转到外部网站。
具体实现代码(PHP 5.6兼容)
先写一个处理URL的函数:
function formatExternalUrl($url) { // 先清理首尾的空格 $url = trim($url); if (empty($url)) { return ''; } // 检查是否已经有协议头(http/https/ftp等) $hasProtocol = preg_match('/^(https?:\/\/|ftp:\/\/|ftps:\/\/)/i', $url); if (!$hasProtocol) { // 没有的话,默认添加https:// $url = 'https://' . $url; } return $url; }
然后在生成链接的时候调用这个函数:
// 假设从MySQL查询到的网址存在$userSubmittedUrl变量里 $userSubmittedUrl = $dbResult['website_address']; // 替换成你实际的数据库字段名 $properUrl = formatExternalUrl($userSubmittedUrl); // 输出安全的可点击链接 echo '<a href="' . htmlspecialchars($properUrl) . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($userSubmittedUrl) . '</a>';
额外说明
htmlspecialchars()一定要加,能防止用户输入恶意代码导致XSS攻击,这是处理用户输入的基本安全规范target="_blank"让链接在新窗口打开,用户体验更好;rel="noopener noreferrer"是安全最佳实践,避免被打开的外部页面篡改你的页面- 如果担心有些网站不支持HTTPS,也可以先尝试请求检测,但大部分网站现在都支持HTTPS了,直接加
https://是最省心的方案
这样处理后,不管用户输入的是哪种格式的网址,都能正确跳转到对应的外部网站,再也不会出现跳转到自己域名下的问题啦。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

