You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP header('Location')无法跳转,仅输出页面内容至控制台

PHP页面跳转问题解决建议

核心问题分析

你遇到的header("Location: ...")不跳转反而输出目标页面内容的情况,大概率是输出缓冲处理不当、脚本未终止执行,或者是请求为AJAX类型导致的。以下是针对性的解决步骤:


1. 完善输出缓冲处理并终止脚本

只在跳转前调用ob_clean()不够,应该在脚本最开头就开启输出缓冲,避免任何隐性输出(比如PHP文件开头的空格、UTF-8 BOM),且跳转后必须终止脚本执行:

<?php
ob_start(); // 脚本开头立即开启输出缓冲

function isValid(){
    if(
        $_POST["name"] != "" &&
        $_POST["tel"] != "" &&
        $_POST["email"] != "" &&
        $_POST["msg"] != "" &&
        $_POST["reg"] != ""
    ) {
        return true;
    }
    return false;
}

if (isValid()){
    $recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
    $recaptcha_secret = 'XXXXXXsecretkeyXXXXX';
    $recaptcha_response = $_POST['recaptchaResponse'];
    $recaptcha = file_get_contents($recaptcha_url.'?secret='.$recaptcha_secret.'&response='.$recaptcha_response);
    $recaptcha = json_decode($recaptcha);
    
    if($recaptcha->success == true && $recaptcha->score >= 0.5 && $recaptcha->action == "submit"){
        $Name = $_POST["name"];
        $Tel = $_POST["tel"];
        $MailFrom = $_POST["email"];
        $Message = UTF8_decode($_POST["msg"]);
        $Reg = $_POST["reg"];
        $MailTo  = "mail@mail.com";
        $Subject = "".$Name." | Mail@mail.com";
        $Headers = array(
            'From'         => $MailTo,
            'Reply-To'     => $MailTo,
            'MIME-Version' => '1.0',
            'Content-type' => 'text/html',
            'charset'      => 'UTF-8',
            'X-Mailer'     => 'PHP/' . phpversion()
        );
        $Msg = 'Namn: ' . $Name . '<br />Telefonnummer: ' . $Tel . '<br />E-mail: ' . $MailFrom . '<br />Regnummer: ' . $Reg . '<br /><br />Meddelande: ' . wordwrap($Message, 50);
        $test = mail($MailTo, $Subject, $Msg, $Headers);
        
        if ($test === true) {
            ob_clean(); // 清空所有已缓冲的输出
            header("Location: redirect.html");
            exit; // 必须终止脚本,防止后续代码执行或输出干扰
        } else {
            echo "Meddelandet kunde inte skickas, vänligen kontakta oss på följande mail. (mail@mail.com)";
        }
    } else {
        echo "Vi tror att du är en robot, är du inte en robot så vänligen kontakta oss på följande mail. (mail@mail.com)";
    }
}

ob_end_flush(); // 未触发跳转时,正常输出内容
?>

2. 排查AJAX请求场景

如果你的表单是通过AJAX(fetch、axios等)提交的,header("Location")不会触发浏览器页面跳转,只会把目标页面内容作为AJAX响应返回,这就会出现在控制台中。需要前后端配合处理:

  • PHP中判断AJAX请求并返回跳转指令:
    if ($test === true) {
        if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            // AJAX请求,返回JSON让前端处理跳转
            echo json_encode(['redirect' => 'redirect.html']);
            exit;
        } else {
            // 普通表单提交,执行跳转
            ob_clean();
            header("Location: redirect.html");
            exit;
        }
    }
    
  • 前端AJAX回调中处理跳转:
    // 示例用fetch
    fetch('你的PHP文件路径.php', {
        method: 'POST',
        body: new FormData(document.querySelector('form'))
    })
    .then(res => res.json())
    .then(data => {
        if (data.redirect) {
            window.location.href = data.redirect;
        }
    });
    

3. 清除隐性输出隐患

  • 检查PHP文件开头的<?php标签前是否有空格、换行或UTF-8 BOM(用编辑器设置编码为「无BOM的UTF-8」)
  • 开启PHP错误提示,排查是否有隐性的警告/错误输出:
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    

4. 使用绝对路径增强可靠性

相对路径可能因当前URL层级出错,改用绝对路径更稳定:

header("Location: https://你的域名.com/redirect.html");

内容的提问来源于stack exchange,提问作者Theo Esberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:25:13