关于php:header(‘location:..’)不起作用

header('location: ..') not working

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

(2)以通过将url编码的get请求发送到index.php形成所有页面的方式来设置网站的模板系统

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

(4)通过执行以下操作来重定向到下一页:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$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";
    }

}

解决了

这是在代码中其他位置?>之后留有空格的问题。 将以下命令放置在代码顶部后,这向我显示了:

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

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


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

1
2
// echo $path_choice;
// echo $page_inc;

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


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

1
2
3
<?php
ob_start();
?>


您可以尝试使用JavaScript方式重定向页面:

1
echo 'window.location ="'.$url.'";';


我看到一个" destroy_session()",您在某处使用session_start()吗?
确保没有内容(包括(会话)cookie)已发送。

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

其他麻烦源:
-BOM
-包含文件中的多余行


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

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

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


尝试一下。它会工作

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

代替header("location: index.php");


确保在之前的php文件中没有空格。如果您在之前将文件编码类型更改为不带BOM和退格键的UTS_8,并且确保文件中没有后缀session start(),则可能会有所帮助。应该在之后


我相信您需要检查if-stack并确保您进入每个循环。在每个if语句之后放置一个回声,以确保甚至对header()进行求值,从而可以比预期的更早地剪切循环。

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


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

例如

1
2
3
4
5
6
7
8
9
<?php
some code this is the correct way
?>

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

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


确保代码开头没有空格

例如:

1
2
3
4
5
6
------whitespace----
<?php
.
.
.
. ?>

删除第一行中的空间,以使必须位于第一行中。


好吧,如果您尝试了所有步骤,则此示例可以提供帮助(HTML / PHP):

1
2
3
4
5
6
7
8
<?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>'
;
?>