【问题标题】:Why do I get "Do you want to submit the form again" even after redirect?为什么即使重定向后我也会收到“您要再次提交表单”吗?
【发布时间】:2012-08-03 13:14:55
【问题描述】:

我有一个奇怪的问题 - 见下文。

第 X 页

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

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

【问题讨论】:

  • 您如何执行重定向?您确定您不只是执行 internal 重定向到 CodeIgniter 路由而不是真正的 HTTP 重定向吗?你能看到 HTTP 流量中的重定向(你可以使用 Charles Proxy 等工具对其进行监控)吗?
  • @Matt 之后还有 redirect() 。我正在使用 CI 的 redirect() 函数。所以我发布数据,保存并将其重定向回相同的 URL。有意义吗?
  • 知道了。我会删除我的评论,因为它可能会产生误导。也是不正确的。
  • 在 chrome 开发工具中,转到网络选项卡,清除所有请求并激活录制。然后张贴表格。你看到了什么?
  • @Quentin - 我正在使用 CI 的 redirect('PAGE_URL') - 什么是内部重定向?

标签: php codeigniter


【解决方案1】:

大家好

这不是CodeIgniter 问题。这是Firefox 的问题。我正在使用14.0.1 版本的Firefox

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


更新

在 Firefox 中我收到这条消息 -

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

我只是设置了另一个脚本(没有 CI)并在 Firefox 中进行了测试。我试图创建类似的过程(即发布并重定向到同一页面)......我根本没有收到这条消息。刷新工作得很好。 所以我现在把它带回 CI 上?

更新 2

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

我正在使用 CI 的重定向功能 - 见下文 - 第二个参数采用默认值作为“自动”,当它是 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;
}

【讨论】:

  • 可能是 CI 错误地发出了 307 代码?除此之外,如果是这种情况,它似乎是一个 FF 错误(如果不是,它似乎是一个无处不在的错误)。
  • @DaveRandom - 不,它不是 307 - '罪魁祸首'是 header('Refresh:0;url='.$uri); - 我在上面提到的普通 php 脚本中尝试了相同的标题,它使 FF 显示确认对话框。
  • 对,这是你的问题。 Refresh: 是非标准标头。这不能被认为是一个错误,因为没有官方文档定义预期的行为。重定向应使用Location: 标头,POST/Redirect/GET 机制应使用303 响应代码。我在对该问题的评论中提到的代码是正确的、符合 RFC 的方法。
猜你喜欢
  • 2021-08-21
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2013-06-14
  • 2017-02-20
  • 2019-10-11
  • 2018-10-31
相关资源
最近更新 更多