为什么我得到“;你想再次提交表格吗;即使在重定向之后


Why do I get "Do you want to submit the form again" even after redirect?

我在这里遇到了一个奇怪的问题-请参阅下文。

第X页

  • 包含方法为post的表单
  • 用户提交表单-有一些表单验证
  • 如果一切都有效,我保存数据,在会话中设置一条flash数据消息(即查询成功/失败),并将用户重定向()到current_ur()
  • 现在,我可以看到闪烁的消息,如果我按F5-我明白了,你想再次提交表格吗

这不应该只是刷新页面吗?如何阻止它再次提交请求?如果我重定向到第Y页,并在那里按F5,那么它不会要求我重新提交吗?我在这里迷路了!

好吧,伙计们

这不是CodeIgniter问题。这是Firefox的问题。我使用的是Firefox14.0.1版本。

我在IE 7, 8, 9Safari 5,Chrome(最新)中尝试了相同的表单和流程——它们没有显示在F5上重新提交表单的确认对话框。


更新

在firefox中,我收到了这个消息-

要显示此页面,Firefox必须发送重复的信息执行的任何操作(如搜索或订单确认)早些时候。

我只是设置了另一个脚本(没有CI),并在Firefox中进行了测试。我尝试创建类似的过程(即发布并重定向到同一页面)。。。我根本没收到这个消息。刷新工作正常所以我现在就回到CI

更新2

好吧,我想我现在已经破解了-

我使用的是CI的重定向函数——见下文——第二个参数的默认值为"auto",当它是auto时,它会将标头发送为header('Refresh:0;url='.$uri);,这会使Firefox抛出上述消息。如上所述,我在其他浏览器中没有得到相同的行为。我希望它能帮助到别人。

function redirect($uri = '', $method = 'auto', $http_response_code = 302)
{
    if ( ! preg_match('#^https?://#i', $uri))
    {
        $uri = site_url($uri);
    }
    // IIS environment likely? Use 'refresh' for better compatibility
    if (DIRECTORY_SEPARATOR !== '/' && $method === 'auto')
    {
        $method = 'refresh';
    }
    switch($method)
    {
        case 'refresh':
            header('Refresh:0;url='.$uri);
            break;
        default:
            header('Location: '.$uri, TRUE, $http_response_code);
            break;
    }
    exit;
}