7

我知道这是一个很常见的问题,但我找不到答案

我有一个 post.php,它向 controller.php 提交一个 post 表单当它正确时,在控制器中它会:

header("Location: ./post?ok=1");

帖子实际上是插入的,它通过上面的行,但是浏览器中的 url 似乎从未改变,最后没有 ok 参数,

我可以使用会话变量来存储这样的成功/失败参数,但这种方式应该可以工作

post.php:

<form action="controller" method="post">
    <input name="test" value='test' type="text" />
    <input type="submit" value="post"  />
</form>

控制器.php:

<?php
    header("Location: ./post?ok=1");
?>

编辑1:

header("Refresh:1;url=http://localhost/test/post?ok=1"); //doesn't work better

编辑2:

在 post.php 顶部我放了

debug("post l ".count($_POST));
debug("get l ".count($_GET));

他们在提交之前显示 0,在提交之后也显示 0

编辑3:它有效

被阻止:

if ($success){
    header("Location: ./post?ok=1");
}
header("Location: ./post"); 

那应该是:

if ($success){
    header("Location: ./post?ok=1");
} else {
    header("Location: ./post");
} 

谢谢大家

4

5 回答 5

3

尝试使用 HTTP 状态代码 303 请参阅 Oter:

header("Location: your/location", true, 303);
于 2012-06-05T05:56:44.913 回答
3

首先你不应该使用$_SERVER['HTTP_REFERER']这是不安全的。此外,客户端也可能不会发送此标头。现在我不知道怎么做,但我确信这可以用来劫持您的网站以获得邪恶的东西。

更好的是,您应该知道表单数据来自哪里并将用户重定向回那里。

顺便说一句,您的重定向可能不像预期的那样工作,因为 url 已经包含一个问号。所以你必须添加更多带有&符号的参数。

对于重定向,我建议使用 HTTP302 Found响应状态。但是你必须确保之前没有其他任何东西被发送出去。在以下行之前不能有 HTML 输出或空header行:

header("Location: http://".$_SERVER['HTTP_HOST']."/your/source.form", true, 302);
于 2012-06-05T06:15:02.607 回答
1

服务器端可能存在一些问题(例如,您的代码在设置标题之前会打印出一些内容)。为了调试它,你需要display_errors = On在你的 php.ini 中设置或在你的代码中临时启用它ini_set('display_errors', 1)

在大多数情况下,错误是"Cannot modify header information - headers already sent."。确保 PHP 结束标记 ( )print之后没有echo或任何空格和多余的行?>

于 2012-06-05T06:08:04.927 回答
1

这可能是服务器进行第二次重定向的问题。

header('Location: post.php?ok=1', true, 303);
exit;

尝试将扩展名.php添加到 url,以确保post?ok=1不会被服务器重定向到post.php(例如 htaccess)。在额外的重定向中,您可能会丢失 get 参数。然后不要忘记在标头重定向后添加退出。

于 2012-06-05T06:29:02.460 回答
0

实际上...看来您没有使用“exit”来关注 header() 调用。例子:

header( 'location: ' . $location ); exit;

header( 'location: ' . $location, true, 301 ); exit;

当您在调用后“退出”时,浏览器地址栏中的 URL 会发生变化,因为代码被阻止继续执行。否则,代码将继续执行,导致 URL 保持不变。

于 2014-07-02T21:10:17.643 回答