PHP Redirect Header函数失效求助:跳转地址格式异常
PHP重定向脚本异常原因及修复方案
问题根源
- 强制拼接当前域名:你的脚本默认把所有传入的
$url当作站内相对路径,不管它是外部链接还是内部路径,都强制拼在当前域名后面,所以传入google.com时,就会生成http://website.com/google.com/;如果$url开头带/,就会出现双斜杠(比如website.com//google.com/)。 - 未识别外部完整URL:脚本没有判断传入的
$url是否是带协议头的完整外部链接,导致外部地址被错误处理成内部路径。
修复后的代码
public function redirect($url, $permanent = false) { // 先判断是否是完整的外部URL(带http/https协议) if (preg_match('/^https?:\/\//i', $url)) { $redirectUrl = $url; } else { // 处理相对路径,拼接当前域名和协议 $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http'; $domain = $_SERVER['HTTP_HOST']; // 去掉$url开头的斜杠,避免双斜杠 $cleanUrl = ltrim($url, '/'); $redirectUrl = $protocol . '://' . $domain . '/' . $cleanUrl; } header('Location: ' . $redirectUrl, true, $permanent ? 301 : 302); exit(); }
关键改动说明
- 新增正则判断:用
preg_match('/^https?:\/\//i', $url)识别带协议头的完整URL,这类URL直接使用,不拼接当前域名。 - 清理相对路径:用
ltrim($url, '/')去掉$url开头的斜杠,避免拼接后出现双斜杠(比如website.com//xxx)。 - 逻辑拆分:把外部URL和内部相对路径的处理分开,保证两种场景都能正常跳转。
内容的提问来源于stack exchange,提问作者user21567477
相关产品推荐
相关产品推荐

