【问题标题】:header('location: ..') not working标头('位置:..')不起作用
【发布时间】:2011-04-02 15:39:24
【问题描述】:

(1)我正在将我的网站上传到远程 Web 服务器。

(2)网站的模板系统设置为所有页面都是通过向index.php发送url编码的get请求形成的

(3)加载初始页面工作。此页面通过评估其表单的值来确定下一页的位置。

(4)重定向到下一页的方法是:header('location: next_page')

(5)由于某种原因,没有执行重定向。代码如下所示:

$error = "";
if(isset($_POST['index_choice'])){
    $path_choice = isset($_POST['path']) ? $_POST['path'] : NULL;

    //echo $path_choice;
    //echo $page_inc;

    //nothing after this

    if($path_choice != null){

        if($form->is_connected()){

            //if($path_choice != "" || $path_choice != NULL){
                if($path_choice == "new"){

                    //header('location: /login.php');
                    //header('location: page/login');
                    header('location: /index.php?page=login');
                    exit();

                }
                else{

                    //header('location: /amend.php');
                    //header('location: page/amend');
                    header('location: /index.php?page=amend');
                    exit();
                }
            //}
            /**
            else{
                //destroy_session();
                $error = "You haven't selected a path. Please choose a path";
            }
             *
             */
        }
        else{
            //destroy_session();
            $error = "Problems with connecting to the database";
        }
    }else{
        //destroy_session();
        $error = "You have not indicated your choice";
    }

}

已解决

这是在代码中的其他位置?> 之后有一个空格的问题。在代码顶部放置以下命令后,我发现了这一点:

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

我要感谢所有试图提供帮助的人。

【问题讨论】:

  • “问题是在代码中的其他地方的 ?> 后面有一个空格。” - 如果可以的话,一个很好的理由在 .php 文件的末尾去掉 PHP 结束标记。从而避免空白问题。

标签: php apache http-headers header


【解决方案1】:

确保代码开头不应有空格

例如:

------whitespace----
<?php
.
.
.
. ?>

从第一行删除空格,这样&lt;?php 必须在第一行。

【讨论】:

    【解决方案2】:

    试试这个。它会工作

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

    而不是header("location: index.php");

    【讨论】:

    • 这太乱了:p而且刷新需要很长时间
    【解决方案3】:

    好吧,如果你尝试了所有方法,这个例子会有所帮助(HTML/PHP):

    <?php
        header("HTTP/1.0 404 Not Found");
        echo '<html>
                <head>
                    <meta http-equiv="Refresh" content="0;url=http://www.url.com/index.php?code=404" />
                </head><body></body>
              </html>';
    ?>
    

    【讨论】:

      【解决方案4】:

      你可以试试javascript重定向页面的方式:

      echo '<script>window.location = "'.$url.'";</script>';
      

      【讨论】:

      • 我注意到一些插件过早地冗长,搞砸了对标题的任何调用。在这种情况下,使用 JS 可以有效地解决问题。
      【解决方案5】:

      只需确保在您的 php 代码之前没有空格,因为这很重要。

      例如

      <?php
      some code this is the correct way
      ?>
      
      --------------
      
      <?php
      some code this is the incorrect way the space above matters
      ?>
      

      【讨论】:

      • 我已经编辑了答案以显示代码,但它似乎没有显示您想要的内容。请检查我的编辑。
      【解决方案6】:

      添加此代码到第一个代码:

      <?php
      ob_start();
      ?>
      

      【讨论】:

        【解决方案7】:

        确保在 php 文件的 &lt;?php 之前没有空格。如果您在&lt;?php 之前将文件编码类型更改为不带BOM 和退格键的UTS_8 并确保在文件中的任何内容之后没有session start(),这可能会有所帮助。应该是之后

        【讨论】:

          【解决方案8】:

          看起来您在发送标头(“位置”)之前正在向浏览器回显文本。 在执行 header() 之前,您不能将内容发送到浏览器,因为您的回显将强制发送标头。将这些行注释掉,看看它是否有效:

          // echo $path_choice;
          // echo $page_inc;
          

          现在您的标头将被发送,您将被重定向。

          【讨论】:

          • @Karst Lok 这看起来是正确的答案,我已经按照你的建议做了。但是,它并没有改变任何东西。
          • 尝试添加完整的地址,包括http:///https://,如果你想按书去做,你必须用大写的L写Location
          • @Karst Lok:根据 RFC 2616,HTTP 标头名称不区分大小写。
          • @Karst Lok 使用完整地址没有任何作用。
          • 你的代码有什么更高的地方?开头&lt;?php前有空格吗?您的错误日志中有任何内容吗?
          【解决方案9】:

          像下面这样的简单 PHP 脚本可以工作吗?

          <?php header('Location: /index.php?page=login'); ?>
          

          您还必须确保实际上采用了带有 $path_choice != null$form-&gt;is_connected() === true 的代码路径,因为您的错误状态根本没有设置 HTTP 标头。

          【讨论】:

          • 现在确保在您的脚本中采用正确的代码路径。虽然这更像是 StackOverflow 而不是 ServerFault 的问题。
          • 成功了。实际上我在 index.php 之前丢失了 /。谢谢!
          【解决方案10】:

          我认为您需要检查您的 if 堆栈并确保您进入了每个循环。在每个 if 语句之后放置一个 echo 以确保 header() 甚至被评估,你的循环比你预期的更早被切断。

          我的怀疑与 null 和 $path_choice != null 的使用有关。您是否尝试过 is_null() 或 isset() ,因为它们专门用于检查变量是否为空。此外, !== 操作数也可以在这种情况下工作,但我不确定 PHP 是否有这种情况。

          【讨论】:

            【解决方案11】:

            我看到一个“destroy_session()”,你在某处使用 session_start() 吗? 确保未发送任何内容(包括(会话)cookies)。

            调试提示:设置error_reporting(E_ALL)(包括E_NOTICE)。 这将为您提供发送标头的行。

            其他问题来源: - BOM - 包含文件之前的额外行

            【讨论】:

              猜你喜欢
              • 2013-07-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多