javascript - 使用 `GET` 的客户端请求表单,即使定义了 `POST`。 javascript iframe 是原因吗?

标签 javascript jquery post http-headers httprequest

我的网站上有两个使用 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.phpa.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 页面.

另一方面,在这里大声思考,由于“真实世界”用户,可能会发生一些情况。

  1. 用户碰巧为 b.php 页面添加了书签,因此当他们尝试使用他们的书签。

  2. 用户尝试刷新页面 b.php,然后收到关于“表单重新提交”的警告。像大多数真实用户一样一无所知,他们取消了表单重新提交,然后单击地址栏并单击浏览器上的GO,其唯一目的是重新加载页面。这也可能导致 GET 请求发送到 b.php 页面。

考虑到设计表单提交的页面流时的最佳实践,您最好只在 b.php 中“处理”您的表单数据,然后使用 GET 请求将 302 Redirect 返回到另一个显示结果的页面。这将允许用户“刷新”页面而无需重复提交表单,并且还允许用户将结果页面添加为书签。

关于javascript - 使用 `GET` 的客户端请求表单,即使定义了 `POST`。 javascript iframe 是原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507315/

相关文章:

javascript - 单击按钮后输入的值为空

javascript - 从 html 文件上的 github API 返回结果 json

javascript - MouseOut 函数仅工作 1 次

javascript - 无法使用 jQuery 从元素中删除类

android - 为什么 WebResourceResponse 在 shouldInterceptRequest() 中返回 null?

ajax - CGridView 使用 ajax post 请求添加另一个删除按钮

javascript - 如何解决: node module?的脚本错误

javascript - 单击类时使数字递增

javascript - 导入时从 json 创建键值对

jquery - 为什么我的 "content"类下面的任何内容在事件列上都消失了?