Php标题位置重定向不起作用

时间:2014-01-20 04:17:37

标签: php

不知道为什么这不起作用。这是代码:

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    echo $_POST['cancel'];
}

不是重定向页面,而是将此输出cancel添加到网页。它跳过了重定向。为什么?我怎样才能解决这个问题? page1.php是一个与当前页面位于同一文件夹中的实际页面。上面的代码是php文件的第一行。没事。没有。甚至没有空格。

15 个答案:

答案 0 :(得分:19)

这可能是标题已经发送产生的问题。

为什么

如果您在决定重定向之前已回显任何内容,则会发生这种情况。如果是这样,那么初始(默认)标头已经被发送,并且新标头不能替换已经准备好发送到浏览器的输出缓冲区中已有的东西。

有时甚至不需要自己回应:

  • 如果错误输出到浏览器,它也被视为内容,因此必须在错误信息之前发送标题;
  • 如果你的一个文件是用一种格式编码(比如说ISO-8859-1)而另一种是用另一种格式编码(比如用带有BOM的UTF-8),两种编码之间的不兼容可能会导致一些字符变成输出;

我们来检查

要测试是否是这种情况,您必须启用错误报告:error_reporting(E_ALL);并设置要显示的错误ini_set('display_errors', TRUE);,之后您可能会看到一个警告,指出已发送的标头。

让我们解决

修复此类错误:

  • 在输出任何内容之前在代码中的某处写入重定向逻辑;
  • 使用输出缓冲区来捕获任何传出信息,并且只有在您知道所有重定向尝试都已运行时才会释放它;
  • 使用适当的MVC框架,他们已经解决了;

更多

MVC通过确保逻辑在控制器中并且控制器仅在控制器的末尾触发视图的显示/呈现来在功能上解决它。这意味着您可以决定在操作中的某个位置执行重定向,但不能使用视图。

答案 1 :(得分:13)

使用@obstart或尝试使用Java Script

将您的obstart();放入页面顶部

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

如果您使用Javascript使用window.location.href

window.location.href示例:

 if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
    {
        echo "<script type='text/javascript'>window.location.href = 'page1.php';</script>"
        exit();
    }

答案 2 :(得分:13)

之前我遇到过这样的问题,现在我不再使用header('Location: pageExample.php');,而是使用javascript的document.location

改变你的:

header('Location: page1.php');

对于这样的事情:

echo "<script type='text/javascript'> document.location = 'page1.php'; </script>";

顺便说一下echo $_POST['cancel'];的目的是什么?只要删除那条线,如果你想要的只是重定向。我每次都在使用<script>并且它不会让我失望。 : - )

答案 3 :(得分:8)

我在godaddy托管中也有类似的问题。 但在放入ob_start()之后;在页面重定向的php页面的开头,它工作正常。

请找到修复的示例:

文件名:的的index.php

<?php
ob_start();
...
header('Location: page1.php');
...
ob_end_flush();
?>

答案 4 :(得分:5)

对我来说也没用。然后我尝试在PHP内部使用javascript

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

这肯定会奏效。

答案 5 :(得分:3)

佩卡在评论中回答了我的问题。他没有回复,所以我现在。在标题重定向后使用exit()方法。由于某种原因,页面的其余代码在header()方法重定向后继续执行。当其余代码执行时,echo语句将输出到页面。输出到页面后,您无法使用标题功能重定向。要避免执行其余代码,请使用exit()。谢谢佩卡。

更新:使用网络浏览器Internet Explorer时,我注意到$ _POST ['cancel']不可靠。我不确定为什么会这样,但我怀疑IE在表单提交上发布了其他变量,特别是发布了变量'cancel'。我通过使用“取消”以外的变量名来解决这个问题。使用exit()和唯一变量名的组合对我有用。

答案 6 :(得分:3)

尝试添加

  

ob_start();

位于代码顶部,即包含声明之前。

答案 7 :(得分:3)

我有类似的问题...... 通过添加ob_start();ob_end_flush();解决 ...

<?php 
ob_start();


require 'engine/vishnuHTML.class.php';
require 'engine/admin/login.class.php';

$html=new vishnuHTML();
 (!isset($_SESSION))?session_start():"";

/* blah bla Code
...........
...........
 */

</div>
</div>
<?php
}



ob_end_flush();
?>

将ob_start()视为&#34;开始记住通常会输出的所有内容,但还没有对它做任何事情。&#34;

ob_end_clean()或ob_flush(),它们会停止保存并丢弃保存的内容,或者分别停止保存并输出所有内容。

答案 8 :(得分:3)

Neer在这里指定退出代码,以便php不再执行

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');        
    exit(0); // require to exit here 
}

答案 9 :(得分:3)

当您在页面顶部开始<?php标记时,请确保在<?php之前不留空格。

答案 10 :(得分:2)

要小心处理可能影响已经完成的“输出”的空格和其他内容。我当然知道这一点,但仍然遇到同样的问题。我的整个“Admin.php”文件在关闭php-tag后有一些空格?&gt;在最后一行的底部:)

通过添加......

轻松发现
error_reporting(E_ALL);

...告诉我生成输出的代码行。

答案 11 :(得分:1)

试试这个,在页面顶部添加@ob_start()功能,

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

答案 12 :(得分:1)

使用以下代码:     

if(isset($_SERVER['HTTPS']) == 'on')
{

    $self = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    ?>

     <script type='text/javascript'>
     window.location.href = 'http://<?php echo $self ?>';
     </script>"
     <?php

     exit();
}
?>

答案 13 :(得分:0)

在文件顶部放置<?php标记(从文档的第一行开始)

不是:

--- Blank space or something ---
<?php

但是:

<?php
..your code
header('Location: page1.php');
...

答案 14 :(得分:0)

为什么您尝试用header function.来回显

尝试一下- 标头(字符串,替换,http_response_code)