我正在一个带有简单登录脚本的网站上工作。情况是这样的:
在 frontpage( index.php
) 上,用户使用登录表单登录,然后在 中对其进行评估login.php
。如果数据不正确,用户将被重定向回主页,其中应显示错误消息,并保存在$_SESSION['error']
. 显示消息后,未设置变量以确保仅显示一次(如果用户重新加载页面,则不会再次显示)。仅供参考,整个站点都被ob_*
功能缓冲。
现在的问题是,在重定向回首页后(例如,如果密码错误),它不会重新加载页面而是显示旧版本,就像根本没有请求或回答一样。问题必须是服务器端的,因为在我手动重新加载之前不会显示错误文本(因此之前没有第二次执行代码)。
我也尝试在重定向之前删除缓冲区
ob_end_clean();
header("Location: " . HOME);
或在标头中设置缓存:
header( "Cache-Control: no-store, no-cache, must-revalidate" );
(这当然是客户端,但我还是试过了)。
有谁知道如何解决这个问题或为什么会这样?
提前致谢
登录重定向:( login.php
)
//other code
if (!PwHash::check_password($db_password, $input['password'])) {
$_SESSION['error'] = TRUE;
$_SESSION['error_type'] = 'login';
header("Location: " . HOME); //HOME holds the default path
exit;
} else {
//other code
错误输出:( index.php
)
if (isset($_SESSION['error']) AND $_SESSION['error'] == TRUE) {
//error output
unset($_SESSION['error']);
}
编辑:
好的,我应该添加更多细节。是的,为所有错误和警告设置了错误报告,不,我没有得到它们。此外,缓冲区或会话不应该有问题,至少设置没有问题。这两个文件都是这样开始的,并且在 header() 语句之前没有任何内容发送到客户端:
session_start();
ob_start();