header('location: ..')无法正常工作

14
(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 结束标记是一个很好的选择,从而避免空格问题。 - Ian Lewis
11个回答

16
看起来你在发送header('location')之前向浏览器回显文本。你不能在执行header()之前向浏览器发送内容,因为你的echo会强制发送一个header。请注释掉这些行并查看是否有效:
// echo $path_choice;
// echo $page_inc;

现在您的头文件将被发送并且您将被重定向。


@Karst Lok看起来这是正确的答案,我已经按照你的建议去做了。但是,这并没有改变任何事情。 - Fortisimo
尝试添加完整的网址,包括http:// / https://。如果您想按照规范执行,必须使用大写字母L编写Location。 - Karst Lok
@Karst Lok:根据RFC 2616,HTTP头部字段名称不区分大小写。 - joschi
@Karst Lok 使用完整地址没有任何作用。 - Fortisimo
4
你的代码中有什么更高层级的部分吗?在 <?php 的前面有空格吗?错误日志中有任何信息吗? - Matt Gibson

14

这段代码添加到代码的开头:

<?php
ob_start();
?>

8
您可以尝试使用JavaScript重定向网页的方式:

您可以尝试使用JavaScript的方法来重定向页面:

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

我注意到一些插件过早地输出冗长的信息,导致任何对头部的调用都会出现问题。在这种情况下,使用JS可以有效地解决这个问题。 - Alberto Alexander Rodriguez

4

试试这个,它会生效的。

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

使用header("location: index.php");的替代方法:


这太乱了 :p 而且刷新需要相当长的时间 - Sander Van Keer

2
以下简单的PHP脚本是否有效?
<?php header('Location: /index.php?page=login'); ?>

您还需要确保使用 $path_choice != null$form->is_connected() === true 的代码路径实际被执行,因为您的错误状态根本没有设置HTTP标头。


现在确保您的脚本中采取了正确的代码路径。虽然这更适合于在StackOverflow而不是ServerFault上提问。 - joschi
它起作用了。实际上,我在index.php之前缺少了一个/。谢谢! - user20072008

2
我看到了一个 'destroy_session()', 你是否在某个地方使用了 session_start()? 确保没有发送任何内容(包括(会话)cookie)。
调试技巧:设置 error_reporting(E_ALL)(包括 E_NOTICE),这将给出头部发送的行号。
其他可能引起问题的来源: - BOM - 在包含文件中的 之前有额外的行。

1

在 PHP 文件的 <?php 前确保没有空格。如果您将文件编码类型更改为 UTS_8(无 BOM),并在 <?php 之前加入回退符,可能会有所帮助。同时,请确保文件中没有任何内容在 session start() 之后。它应该紧跟在这个标记之后。


1

我相信你需要检查你的if语句堆栈,并确保你进入了每个循环。在每个if语句后面放置一个echo,以确保header()被评估,你的循环可能比你预期的要早结束。

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


0

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

例如

<?php
some code this is the correct way
?>

--------------

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

我已经编辑了答案以显示代码,但似乎并没有显示您想要的内容。请查看我的编辑。 - ChrisF

0

嗯,如果你已经尝试了所有方法,这个例子或许可以帮到你(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>';
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接