【问题标题】:PHP Header redirect not working [duplicate]PHP标头重定向不起作用[重复]
【发布时间】:2010-09-30 05:54:54
【问题描述】:
include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');
    exit;

上面的代码一直给我一个重定向问题。错误如下:

警告:无法修改标头信息 - 标头已由(输出 从 /Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15) 开始 /Applications/MAMP/htdocs/testygubbins/OO/test/form.php 在第 16 行。

我完全被这个弄糊涂了。有谁知道我应该怎么做才能让它发挥作用?

编辑

header.php 代码:

<?php
include('class.user.php');
include('class.Connection.php');

$date = date('Y-m-j');

?>
<html>
<head>
    <link rel=StyleSheet href="css/style.css" type="text/css" media=screen>
    <title>Test</title>
</head>
<body>
<div id="page">

【问题讨论】:

  • 如果您已经发送了 HTML 输出,则无法重定向。使用输出缓冲或用 header.php 中的 PHP 块替换 'include "header.php"'。
  • 可能header.php有问题,导致header无法重定向。

标签: php


【解决方案1】:

查看 /Applications/MAMP/htdocs/testygubbins/OO/test/header.php 第 15 行。

在那个位置,它会产生一些输出。修理它。 :)

【讨论】:

  • 不管它是否为空 -- 也会输出一个换行符。
【解决方案2】:

如果我理解正确,header.php(可能是一些 HTML)已经发出了一些东西,所以标题已经设置好了。您可能需要重新检查 header.php 文件中任何可能输出 HTML 或空格的部分

编辑:我现在确定它是由 header.php 引起的,因为你有那些 HTML 输出。您可以通过删除“include('header.php');”来解决此问题行并将以下代码复制到您的文件中。

include('class.user.php');
include('class.Connection.php');

        $date = date('Y-m-j');

【讨论】:

  • 确实也取出了 html。谢谢! :)
【解决方案3】:

仔细查看您的包含 - 也许您在结束后有一个空行?>?

这将导致一些文字空白作为输出发送,从而阻止您进行后续的标头调用。

请注意,在包含文件中保留关闭 ?> 是合法的,这是避免此问题的有用习惯用法。

(编辑:查看你的标题,如果你想输出标题,你需要避免做任何 HTML 输出,或者使用输出缓冲来捕获它)。

最后,正如PHP manual page for header 指出的那样,您真的应该使用完整的 URL 来重定向:

注意:HTTP/1.1 要求绝对 URI 作为 Location: 的参数 包括方案、主机名和 绝对路径,但有些客户接受 相对 URI。你通常可以使用 $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] 和 dirname() 到 从一个相对的创建一个绝对的 URI 一个自己:

【讨论】:

  • 干杯老兄,它是空白。很有趣!
  • 不只是空格,而是导致错误的 PHP 块之后的整个 HTML 输出。
  • 这篇文章的编辑说明了这一点,include中有html代码,立即发送给客户端。
  • 老兄这也是我的问题,我删除了空格和中提琴!!!谢谢。
  • 非常感谢先生。当其他一切都失败时,您的回答使我的脚本栩栩如生。
【解决方案4】:

您可能在 php 文件的某处有一些“纯文本”,它们被解释为脚本输出。它甚至可能是 php 脚本标记说明符之前或之后的换行符(小于 + 问号 + "php")。

此外,如果我没记错的话,根据 http 规范,“Location”标头只接受完整的 URL,而不是相对位置。也要记住这一点。

【讨论】:

    【解决方案5】:

    不要包含 header.php。重定向时不应输出 HTML。

    创建一个新文件,例如。 “pre.php”。把这个放进去:

    <?php
    include('class.user.php');
    include('class.Connection.php');
    ?>
    

    然后在 header.php 中包含它,而不是包含其他两个文件。 在 form.php 中,包含 pre.php 而不是 header.php。

    【讨论】:

      【解决方案6】:

      或者,不要考虑文件中某处的换行符或空格,您可以缓冲输出。基本上,您在文件的开头调用ob_start(),在最后调用ob_end_flush()。您可以在php.net ob-start function description找到更多详细信息。

      编辑: 如果使用缓冲,则可以在 header() 函数之前和之后输出 HTML - 然后缓冲将忽略输出并仅返回重定向标头。

      【讨论】:

        【解决方案7】:

        您的包含会产生输出,因此以后无法发送 http 标头。两种选择:

        1. 将输出移动到包含之后的某个位置。
        2. 使用output buffering,即在脚本的最开头放置ob_start(),最后放置ob_flush()。这使 PHP 能够首先等待收集所有输出,确定以什么顺序呈现它,然后输出它。

        我建议你学习第二个选项,因为它让你更加灵活。

        【讨论】:

          【解决方案8】:

          还可以查看您的 php 文件文本编码。我的是UTF-8BOM,它阻止了脚本工作。但现在删除BOM 后可以完美运行...

          【讨论】:

            【解决方案9】:

            尝试使用 JavaScript 重定向:

            <script type="text/javascript">
              window.location.href='index.php';
            </script>
            

            【讨论】:

            • 搜索引擎如何解释这个?肯定不会是 301 重定向吧?
            【解决方案10】:

            试试这个:

            **ob_start();**
            
            include('header.php');
            
            $name = $_POST['name'];
            $score = $_POST['score'];
            $dept = $_POST['dept'];
            
            $MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
            // Bind a value to our :id hook
            // Produces: SELECT * FROM demo_table WHERE id = '23'
            $MyDB->bind(':date', $date);
            // Run the query
            $MyDB->run();
            
            header('Location:index.php');
            
            **ob_end_flush();**
            
                exit;
            

            【讨论】:

              【解决方案11】:

              也可以试试 include_once() 代替 include() 也可以工作

              【讨论】:

                【解决方案12】:

                常见问题:

                1) header(...); 命令之前不应有任何输出(即 echo... 或 HTML 部分)。

                2)header(...); 之后必须使用exit();

                3) 删除&lt;?php 之前和?&gt; 标记之后的所有空白(或换行符)。

                4) 检查 php 文件(以及其他 .php 文件,即 included) - 他们应该有 UTF8 without BOM 编码(而不仅仅是 UTF-8)。因为默认的 UTF8 在文件开头添加了不可见字符(称为“BOM”),所以你应该避免这种情况!!!!!!!!!!!!

                5) 使用 301 或 302 引用:

                header("location: http://example.com",  true,  301 );  exit;
                

                6) 开启错误报告。并说出错误。

                7) 如果以上都没有帮助,使用 JAVASCRIPT 重定向(但是,不鼓励的方法),可能是自定义情况下的最后机会...:

                echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
                

                【讨论】:

                • 退出;或者死();为我做的
                • "在 header(...); 命令之前不应该有任何输出(即 echo... 或 HTML 部分)" ...节省我的时间,谢谢
                • 如果设置了 php.ini 文件中的“output_buffering”,就可以有输出。我家 Debian 系统上的设置为 4096。我使用的服务器上的那个说它没有设置。
                • 规则是在重定向之前没有输出,但我注意到你的所有答案也阻止了输出之后。之后有输出,是不是有些浏览器重定向不正确?
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-01-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多