PHP:由于认证服务器,POST数据丢失

3
我正在运行一个网站,客户可以提交表单。我在服务器端使用PHP,并使用POST方法(大型表单)。问题是,有时请求以GET请求的形式到达我的Web服务器,没有任何POST信息。这个问题只在从特定客户位置提交表单时出现,而且是间歇性的(大部分时间正常工作)。
使用Fiddler,我认为我确定了正在发生的事情,但想不出解决方法。在stackoverflow上发帖,看看是否有人有想法。
基本上,顺序如下:
1-发送了包含所有适当数据的POST请求。
2-POST请求似乎被一个身份验证代理服务器拦截。
3-代理服务器向POST请求发送HTTP 302响应,并重定向到另一个内部地址进行身份验证。
4-进行身份验证交易(两个GET请求,带有401响应)
5-代理服务器对最后一个身份验证请求回答302重定向,该重定向到原始请求。
6-但浏览器将原始请求作为GET请求而不是POST请求发送,原始请求中没有POST信息。
最终结果是用户看到一个空白页面,并且表单数据丢失。
可能是因为即使原始请求是POST,它也会在URL中包含一些参数(也许是因为此浏览器认为它是GET请求?)?
这是正常行为吗?我读到这是标准的(浏览器总是用GET回答302),但我不相信这是真的,因为这种情况下没有POST请求的解决方案?
一定有一些方法可以解决这个问题,这会导致非常糟糕的用户体验。让我知道你的想法。
1个回答

0
我在使用自定义ErrorDocument时也遇到了类似的问题,特别是针对404页面。显然,在404页面和我假设的401页面上,没有任何帖子数据被发送到它们。我最终所做的是,不再使用errordocument,而是使用重写规则将其转到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]

作为一个完全的旁观者,也许如果你无法确定它是POST还是GET,你可以使用$_REQUEST代替,它能够处理请求,无论以哪种方式进入。


感谢回答,Ian。问题是我无法控制拦截POST请求并返回302以启动身份验证序列的身份验证代理服务器。因此,我正在考虑两种方法。1-找到一种避免身份验证序列的方法或2-以某种方式恢复POST数据(仍然保存在浏览器历史记录中)。但目前没有成功。 - PCJISM

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