【问题标题】:PHP: POST data is lost because of authentication serverPHP:POST数据因身份验证服务器而丢失
【发布时间】:2012-03-25 23:57:50
【问题描述】:

我正在运营一个客户可以提交表单的网站。我在服务器端使用 PHP 并使用 POST 方法(大型表单)。问题是有时,请求作为没有发布信息的 GET 请求到达我的 Web 服务器。仅当从给定客户位置提交表单并且问题是间歇性的(大部分时间都在工作)时,才会出现此问题。

使用提琴手,我想我确定了正在发生的事情,但想不出解决方法。在stackoverflow上发帖看看是否有人有想法。

基本上顺序如下:

1- POST 请求与所有适当的数据一起发送。

2- POST 请求似乎被身份验证代理服务器拦截。

3- 代理服务器向 POST 请求发送 HTTP 302 响应,并重定向到另一个内部地址进行身份验证。

4- 发生身份验证事务(两个 GET 请求,带有 401 响应)

5- 代理服务器响应 302 重定向到最后一个身份验证请求,该请求重定向到原始请求。

6- 但是浏览器将原始请求作为没有发布信息的 GET 请求而不是最初发送的 POST 请求发送。

最终结果是用户出现空白页,表单数据丢失。

可能是因为即使原始请求是 POST,它确实在 URL 中包含一些参数(也许浏览器会因为这些而假定它是 GET?)?

这是正常行为吗?我读过这是按照标准(浏览器总是用 GET 回答 302),但我不敢相信这是这种情况,因为在这些情况下没有解决 POST 请求的方法?

必须有一些方法可以解决这个导致非常糟糕的用户体验的问题。让我知道你的想法。

【问题讨论】:

    标签: php forms post proxy


    【解决方案1】:

    在专门为我使用 404 页面的自定义 ErrorDocument 时,我也遇到过类似的情况。显然有 404 页,我假设可能是 401?没有帖子数据发送给他们。我最终做的不是这个,而是让它以相同的方式进入 404 页面,但我使用重写规则而不是错误文档。

    这是做同样事情的重写规则errorDocument 404

    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteCond %{REQUEST_FILENAME} !-d [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteCond %{REQUEST_FILENAME}index.php !-f
    RewriteRule ^(.*?)$ /error404.php [L]
    

    作为一个完全侧面的想法,如果你无法知道它是否会被发布或获取,你可以使用 $_REQUEST 来代替,它可以处理请求,无论它以哪种方式进入。

    【讨论】:

    • 感谢您回答伊恩。问题是我无法控制拦截发布请求并返回 302 以启动其身份验证序列的身份验证代理服务器。所以我在看两种方法。 1-找到一种方法来避免身份验证序列或 2-以某种方式恢复 POST 数据(仍然位于浏览器历史记录中)。但到目前为止还没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多