我正在运行一个网站,客户可以在该网站上提交表单。我在服务器端使用PHP,并使用POST方法(大型表单)。问题是,有时,请求以GET请求的形式到达我的web服务器,但没有发布信息。只有当表单是从给定的客户位置提交的,并且问题是间歇性的(大部分时间都在工作)时,才会出现此问题。
使用fiddler,我想我已经确定了发生了什么,但想不出变通办法。在stackoverflow上发帖,看看是否有人有想法。
基本上,顺序如下:
1-POST请求与所有适当的数据一起发送。
2-POST请求似乎被身份验证代理服务器截获。
3-代理服务器发送HTTP 302响应POST请求,并重定向到另一个内部地址进行身份验证。
4-进行身份验证事务(两个GET请求,401响应)
5-代理服务器响应302重定向到最后一个身份验证请求,该请求重定向到原始请求。
6-但是浏览器将原始请求作为GET请求发送,不包含任何post信息,而不是原始发送的post请求。
最终结果是在用户处出现一个空白页面,并且表单数据丢失。
可能是因为这样吗?即使原始请求是POST,但它确实在URL中包含了一些参数(也许浏览器因此认为它是GET?)?
这是正常行为吗?我读到这是按照标准的(浏览器总是用GET回答302),但我不敢相信是这样的,因为在这些情况下没有POST请求的解决方案?
必须有一些方法来解决这个问题,这会导致非常糟糕的用户体验。让我知道你的想法。
在使用专门为我设计的404页面的自定义ErrorDocument时,我也遇到过类似的情况。显然有404页,我想可能是401页?没有邮件数据发送给他们。我最终做的不是这样,而是让它以同样的方式进入404页面,但我使用了重写规则而不是错误文档。
以下是做同样事情的重写规则errorDocument404
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}index.php !-f
RewriteRule ^(.*?)$ /error404.php [L]
作为一个完全的旁敲侧击,也许如果你不能四处了解它是要发布还是得到,你可以使用$_REQUEST,它将能够处理请求,无论它是以何种方式发出的。