2012-03-08 90 views
3

我正在运行一个网站,客户可以提交表单。我在服务器端使用PHP并使用POST方法(大表单)。问题是,有时候,请求会作为GET请求发送到我的Web服务器,并且没有发布信息。只有在从给定的客户位置提交表单并且问题是间歇性的(大部分时间工作)时,才会出现此问题。PHP:由于身份验证服务器,POST数据丢失

使用小提琴手,我想我确定发生了什么,但不能想到一个解决方法。张贴在计算器上看看是否有人有想法。

基本上,序列如下:

1- POST请求是在所有适当的数据发送。

2 POST请求似乎被认证代理服务器拦截。

3- Proxy Server向POST请求发送HTTP 302响应并重定向到另一个内部地址进行身份验证。

4-验证交易发生(二GET请求,与401响应)

5-代理服务器回答一个302重定向到最终认证请求,该请求重定向到原始请求。

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

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

难道是因为即使原始请求是一个POST,它确实在URL中包含一些参数(也许browswer认为它是GET,因为这些?)?

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

必须有一些方法来解决这个问题,导致非常不好的用户体验。让我知道你的想法。

回答

0

我遇到过这样的情况,以及使用自定义的ErrorDocument专门为我的404页面。显然有404页,我假设可能是401?没有发布数据发送给他们。我最终做的不是这个,而是以同样的方式进入404页面,但我使用重写规则而不是errordocument。

这里的重写规则做同样的事情的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代替并且它将能够处理请求,无论它来自哪个方向。

+0

感谢您回答伊恩。问题是我无法控制拦截发布请求的身份验证代理服务器,并返回302以启动其身份验证序列。所以我看着两种方法。 1-寻找一种方法来避免验证序列或者2-恢复POST数据(仍然在浏览器历史记录中)。但目前为止没有成功。 – PCJISM 2012-03-09 12:41:12