PHP重定向不会改变网址

7

我是一个可以帮助翻译的助手。

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

我有一个post.php,它将提交的文章表单提交给controller.php

当它正常运行时,在控制器中执行以下操作:

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>

controller.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。

编辑3:它已经起作用了。

被阻止的原因:

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

that should be:

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

感谢大家。

1
我认为您没有正确地给出表单标签的ACTION属性...应该是类似于<form action="controller.php" method="post">。您错过了文件的扩展名。 - Rukmi Patel
你确定头函数已经执行了吗? - xdazz
是的,我在那里放了一个 debug('test')。 - user1125394
控制器是什么?在表单操作中,请提供正确的重定向链接或删除它,如果您想刷新当前页面。 - Hkachhia
"controller" -> controller.php 如果我在表单中加上 .php,它的效果不会更好,如果这是你的意思。 - user1125394
你的“Edit 1”根本不起作用,你混淆了meta refresh重定向和HTTP重定向。 - rekire
5个回答

3

尝试使用HTTP状态码303,参见其他:

header("Location: your/location", true, 303);

3
首先,您不应该使用$_SERVER['HTTP_REFERER'],这是不安全的。此外,客户端可能根本不会发送此标头。现在我不知道如何,但我确信这可能被用于窃取您的网站进行某些邪恶的事情。
更好的方法是了解表单数据来自何处,并将用户重定向回原始页面。
顺便说一句,您的重定向可能不像预期的那样工作,因为URL已经包含问号。因此,您必须使用&符号添加更多参数。
对于重定向,我建议使用HTTP 302 Found响应状态。但是,您必须确保在此以下的header行之前没有发送任何其他内容。不能有HTML输出或空行。
header("Location: http://".$_SERVER['HTTP_HOST']."/your/source.form", true, 302);

我已经放置了header("Location: ./post?ok");但效果不佳,已编辑问题。 - user1125394
在重定向中最好使用完整的URL,相对URL是不好的,因为浏览器可能会混淆源URL和目标URL。重定向应该相对于哪个URL? - rekire
第一个应该可以工作,你只需要确认在头行之前不会发送任何其他内容到客户端。所以只需将这个特殊的行向上移动即可。 - rekire
你说得对,我必须找出是什么额外的东西导致它失败了,只有一些curl_exec(..);所以它不应该失败,谢谢。 - user1125394
最后两个参数目前救了我的命。让我们看看它是否比缓存时间更持久。 - Victor Ferreira

1

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

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


我没有收到这些错误,控制器也没有回显任何HTML或其他内容,只有一些php_curl调用和header()重定向。 - user1125394

1
这可能是服务器进行了第二次重定向的问题。
header('Location: post.php?ok=1', true, 303);
exit;

尝试在URL中添加.php 扩展名,以确保服务器(例如.htaccess)不会将post?ok=1重定向到post.php。 在额外的重定向中,您可能会丢失获取参数。 然后别忘了在标题重定向后添加一个退出命令。


0

实际上... 似乎您没有在header()调用后添加"exit"。 例子:

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

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

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


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