【问题标题】:Php header location redirect not workingPHP标头位置重定向不起作用
【发布时间】:2022-01-17 11:36:50
【问题描述】:

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

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

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

【问题讨论】:

  • 之后不要回显任何内容;执行exit() 来终止脚本。 (发出该标头后,您不应输出任何内容)
  • 这是因为您已经在此上下文中向浏览器发送了数据,因此headers have been sent。打开您的error_reporting 以在将来获得此答案。
  • @Pekka웃 使用 echo 很好,我怀疑条件不够
  • 错误报告已开启。没有错误。如果我取出 echo 语句,那么它仍然会继续处理页面的其余部分。我包含了 echo 语句以显示 if 语句正在执行。
  • @JohnS 试试这个header('Location: ABSOLUTE_URL_HERE', true, 302);

标签: php


【解决方案1】:

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

为什么

如果您在决定重定向之前回显了任何内容,则会发生这种情况。如果是这样,则初始(默认)标头已发送,新标头无法替换输出缓冲区中已准备好发送到浏览器的内容。

有时甚至没有必要自己附和一些东西:

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

让我们检查一下

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

让我们修复

修复此类错误:

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

更多

MVC 通过确保逻辑在控制器中并且控制器仅在控制器结束时触发视图的显示/渲染,在功能上解决了这个问题。这意味着您可以决定在操作中的某处进行重定向,但不能在视图中进行。

【讨论】:

    【解决方案2】:

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

    改变你的:

    header('Location: page1.php');
    

    这样的:

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

    顺便说一句,echo $_POST['cancel']; 的目的是什么?如果您想要的只是重定向,请删除该行。我每次都在使用&lt;script&gt;,它并没有让我失望。 :-)

    【讨论】:

      【解决方案3】:

      使用@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();
          }
      

      【讨论】:

      • 标头重定向只会发送指定您已重定向到的新 URL 的 HTTP 标头。使用 JS 是一种解决方法——这意味着必须接收/解析/运行一个页面(HTTP 标头 + 一些内容),然后 JavaScript 将触发一个新的请求来接收/解析/运行另一个页面。
      【解决方案4】:

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

      请查找修复示例:

      文件名:index.php

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

      【讨论】:

        【解决方案5】:

        我有类似的问题... 通过添加 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() 想象为“开始记住通常会输出的所有内容,但还没有对它做任何事情。”

        ob_end_clean() 或 ob_flush(),分别停止保存并丢弃已保存的内容,或停止保存并立即全部输出。

        【讨论】:

          【解决方案6】:

          对我来说,它也不起作用。然后我尝试在 php 中使用 javascript 之类的

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

          这肯定会奏效。

          【讨论】:

          • 有时它不起作用,你必须把ob_start/end。看我的帖子,你会得到别的东西。
          【解决方案7】:

          这里不需要指定退出代码,所以 php 不会进一步执行

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

          【讨论】:

            【解决方案8】:

            Pekka 在 cmets 中回答了我的问题。他没有发布答案,所以我现在。在标头重定向后使用exit() 方法。由于某种原因,页面的其余代码在 header() 方法重定向后继续执行。当其余代码执行时,将 echo 语句输出到页面。并且在输出到页面后不能使用 header 函数进行重定向。为避免执行其余代码,请使用exit()。谢谢佩卡。

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

            【讨论】:

              【解决方案9】:

              尝试添加

              ob_start();

              在代码的顶部,即包含语句之前。

              【讨论】:

              • 你需要解释一下为什么?
              • 添加 ob_start();页面顶部,例如
              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

                通过添加很容易发现...

                error_reporting(E_ALL);
                

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

                【讨论】:

                  【解决方案12】:

                  试试这个,在页面顶部添加@ob_start()函数,

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

                  【讨论】:

                    【解决方案13】:

                    使用以下代码:

                    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();
                    }
                    ?>
                    

                    【讨论】:

                      【解决方案14】:

                      不是:

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

                      但是:

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

                      【讨论】:

                      • 你在开玩笑吗?我从原来的帖子中复制了以下内容,“上面的代码是 php 文件的第一行。之前什么都没有。没有。甚至没有空格。”看起来我在上面的代码中没有包含开始的 php 标记,但相信我,在开始的 php 标记之前没有空格。重定向后的退出函数解决了这个问题。我认为如果有任何输出,无论有没有退出功能,重定向都不会起作用。
                      • 在我的网站中 exit() 不起作用,但也起作用:"”在文档末尾。
                      猜你喜欢
                      • 1970-01-01
                      • 2014-11-19
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-19
                      • 1970-01-01
                      相关资源
                      最近更新 更多