标头位置重定向在 Web 服务器上不起作用

Posted

技术标签:

【中文标题】标头位置重定向在 Web 服务器上不起作用【英文标题】:header-location redirect doesn't work on web server 【发布时间】:2012-11-20 17:36:50 【问题描述】:

我正在尝试使用

header("Location: index.php")

在我的登录脚本中,但它不适用于我的实时服务器,只能在本地运行。我不知道为什么会有任何问题。

我也做了一些测试:

error_reporting(E_ALL);
ini_set('display_errors', 1);

// header('Location: test.php');

require_once 'class/functions.php';
$func = new Functions();
//$error = "";
if(isset($_POST['loginSubmitted'])) 
    $user = $func->loginUser($_POST);
    if($user == true) 
        session_start();
        $_SESSION['loggedin'] = true;
        header("Location: index.php");
        die('test');
    
    else 
        $error = 'Login nicht erfolgreich.';
    

显示了 die() 函数的“测试”,因此似乎甚至没有发送标头。

(不,在header函数之前没有输出)

编辑 3:

使用 get 代替 post 工作。我真的很困惑。

编辑 2:

我制作了一个缩小版本进行测试,甚至以下内容也不起作用。似乎是服务器问题(与 $_POST 结合使用?!):

<?php 
if(isset($_POST['submitted'])) 
    header('Location: index2.php');

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Login</title>
</head>
<body>
    <form action="" method="post">
        <input type="text" name="name" />
        <input type="submit" name="submitted" value="senden" />
    </form>
</body>
</html>

编辑:更新了代码示例。

【问题讨论】:

您是否 100% 确定在标题之前没有任何输出?这包括您的 PHP 文件中的任何空格,这些空格将被转换为 HTML 中的空格。 我确定,因为在本地机器上它可以工作,如果我之前用 echo 挑起任何输出,我也会得到“标头已发送”错误。 var_dump(headers_sent());查看是否有任何类型的标头被发送。 不同的服务器以不同的方式做出反应,我的本地主机从不抱怨标题之前的输出。然而,这似乎是一个不同的问题。 【参考方案1】:

在尝试设置新标头之前,您可能已经发送了一些输出。必须在发送任何实际输出之前设置所有标头。

如果您尝试这样做,PHP 将触发警告,但您的错误报告设置可能会阻止它。暂时将它们设置为最大值以查看输出的发送位置:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);


echo 'Output!';

header('X-Test: Test');

生产:

Warning: Cannot modify header information - headers already sent by (output started at /test.php:6) in /test.php on line 8

【讨论】:

不。当我在 header-function 之前放置一个 echo 时出现错误。 @movsky 你能设置其他标题吗?尝试设置一个 X-Something 标头进行测试。您的主机可能以某种方式禁用了设置 Location 标头或一般标头。 嗯,是的,当我把它放在文件的顶部时它可以工作。这真的很奇怪。 @movsky 我不确定你的意思是哪个标题有效,但如果你仍然遇到问题,诊断问题所在的最简单方法是创建一个新的空文件redirect.php ,里面只有&lt;?php header('Location: index.php');,看看是否可行。如果没有,问题出在您的主机/您的 PHP 配置上,如果 确实 工作,那么问题出在您的应用程序的某个地方 我更新了开始帖子中的代码。重定向到 test.php 有效,但重定向到 index.php 无效。我没有错误或任何东西。

以上是关于标头位置重定向在 Web 服务器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PHP标头重定向不起作用并停留在login.php上

由于浏览器缓存,PHP 标头 301 重定向不起作用

基于 header(location) 命令重定向 php 页面不起作用;标头已发送错误[重复]

Laravel 7 Auth 在托管站点上不起作用

标头位置不起作用 - 但肯定会被忽略

为啥这个重定向不起作用?