我的网站上有两个使用 POST 方法的后续表单。
我的网站 first.php
的第一页包含以下代码:
<form action="a.php" method="POST" target="_blank">
<input name="value" type="hidden" value="foo"/>
<div class="button"><label><span class="icon"></span>
<input type="submit" class="button-graphic ajax" value="Click Here"></label></div></form>
a.php
只能通过这个 POST 请求访问(否则用户将得到 method not allowed 405 错误)
提交后,此表单将打开带有 AJAX 模式窗口的 a.php
。
a.php
包含另一种形式:
<form action="b.php" method="POST" target="_blank">
<input name="bar" type="hidden" value="none"/>
<div class="border"><label><input type="submit" class="button-graphic2 tracking" value="Continue"></label></div></form>
当用户点击第二种形式的提交时,它会打开b.php
,
也只能通过 POST 请求访问(否则 - 405 错误)。
我能想到的这些表单之间的唯一区别是第二个包含一个跟踪 js 类(打开一个 iframe)。这是 js 代码:
$(document).ready(function() {
$(".tracking").click(function(){
var iframe = document.createElement('iframe');
iframe.style.width = '0px';
iframe.style.height = '0px';
iframe.style.display = 'block';
document.body.appendChild(iframe);
iframe.src = '/track.htm';
});
这样做是为了使用从 track.htm
我注意到大约 5% 的 iPad 访问者遇到了问题。
他们通过 POST 请求正确打开 a.php
,但是当他们继续并继续打开 b.php
时,大约 5% 会发出 GET
请求而不是所需的 POST
请求,导致他们收到 405 错误并离开网站。
我知道这些是真实的人类用户,因为我可以看到他们中的一些人多次尝试打开 b.php
并不断收到这些 405 错误。
这会不会是因为他们的设备同时使用GET
请求来获取track.htm
?这是小故障吗?
如何解决?
编辑 4.4.2015:
由于触发跟踪脚本有可能导致此问题,我想知道是否有另一次触发(或跟踪该 adwords 转换),而不会导致这些 iPad 用户对表单使用“GET”请求
编辑 10.4.2015:
这是 ajax
类的 jquery 代码,它同时影响 first.php
和 a.php
,如 first.php
是父框架:
$(document).ready(function() {
$(".ajax").click(function(t) {
t.preventDefault();
var e = $(this).closest("form");
return $.colorbox({
href: e.attr("action"),
transition: "elastic",
overlayClose: !1,
maxWidth: $("html").hasClass("ie7") ? "45%" : "false",
opacity: .7,
data: {
value: e.find('input[name="value"]').val(),
}
}), !1
})
}),
最佳答案
从技术上讲,这不应该发生。跟踪脚本创建的 iframe 指向 /track.htm
,因此不应该有任何 GET
请求到您的 b.php
页面.
另一方面,在这里大声思考,由于“真实世界”用户,可能会发生一些情况。
用户碰巧为
b.php
页面添加了书签,因此当他们尝试使用他们的书签。用户尝试刷新页面
b.php
,然后收到关于“表单重新提交”的警告。像大多数真实用户一样一无所知,他们取消了表单重新提交,然后单击地址栏并单击浏览器上的GO
,其唯一目的是重新加载页面。这也可能导致GET
请求发送到b.php
页面。
考虑到设计表单提交的页面流时的最佳实践,您最好只在 b.php
中“处理
”您的表单数据,然后使用 GET
请求将 302 Redirect
返回到另一个显示结果的页面。这将允许用户“刷新”页面而无需重复提交表单,并且还允许用户将结果页面添加为书签。
关于javascript - 使用 `GET` 的客户端请求表单,即使定义了 `POST`。 javascript iframe 是原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507315/