表单数据丢失

5

我有一个使用CodeIgniter编写的PHP应用程序,遇到了以下问题。在使用iPad提交表单时,有时会丢失POST数据。我已经尝试了四种不同的访问POST数据的方法。

print_r($this->input->post());
print_r($_POST);
print_r(file_get_contents('php://input'));
print_r($_REQUEST);

所有的搜索都没有返回结果或者是一个空数组。 这个问题似乎只出现在使用iPad或iPhone时,不过在桌面版Safari上进行50次以上的测试中,曾经发生过一次。而在PC浏览器上进行100次左右的测试(包括Firefox、Chrome和IE),都没有出现过这个问题,只有在Safari中出现了一次。
表单的代码;
<form id="email_report_form" name="email_report_form" method="post" accept-charset="utf-8" action="/handleajax/email_page" class="email_report_form ajaxform" onsubmit="return validate();">
    <div class="form_step_container clearfix">
        <div class="element clearfix">
            <div class="col_left">
                <label>Email: <span class="required">*</span></label>
            </div>
            <div class="col_right">
                <input type="text" name="form_email_to" id="form_email_to"  />
                <div>&nbsp;</div>
                <label>Separate multiple email addresses with a comma</label>
            </div>
        </div>
        <div class="element clearfix">
            <div class="col_left">
                <label>Your Message:</label>
            </div>
            <div class="col_right">
                <textarea name="form_email_message" cols="125" rows="5" onkeypress="return checkLength(event, this, 1000);"></textarea>
                <label>(Maximum of 1000 characters)</label>
                <br />
                <input type="hidden" name="redirect_path" id="redirect_path" value="" />
                <input type="submit" value="Send" class="btn btn-primary" />
            </div>
        </div>
    </div>
    <div class="element clearfix">
        <i>Information entered in this form will not be used for marketing purposes or passed to third parties.</i>
    </div>
</form>

在 onSubmit 函数中编写 validate() 代码。

function validate() {
    element = document.getElementById("form_email_to");
    addresses = element.value.split(",");
    for (var i = 0; i < addresses.length; i++) { 
        address = addresses[i].replace(/^\s*|\s*$/g, "");
        if (!validateEmail(address)) {
            alert('The email address "' + address + '" is invalid.');
            element.focus();
            return false;
        }
    }

    if (window.location.hash.length > 2) {
        $('#redirect_path').val(window.location.hash.substring(2));
    } else {
        $('#redirect_path').val(window.location);
    }

    $('#email_report').slideUp();
    return true;
}

表单提交的函数代码:

public function email_page() {
    echo "<br/>ci<br/>";
    print_r($this->input->post());
}

如您所见,这里是我输出帖子数据的地方,但此时数据已经丢失。 有人知道我为什么会遇到这个问题以及如何解决吗?


我认为代码中没有任何错误,请检查config.php文件,特别是csrf_protection。 - TheFoxLab
1
可能的原因是302或301重定向。您将表单提交到/handleajax/email_page。如果您的Web服务器或PHP将用户重定向到另一个位置,您将丢失表单数据。当它是301永久重定向时,大多数浏览器在被重定向一次后会自动转到新位置。这只是许多可能性之一,但很容易检查。 - jan
你是在使用真正的iPad还是iPad模拟器? - Nouphal.M
@jan 你可以看到,在emai_page函数的第一行,我正在丢失表单数据,并且在此之前没有任何重定向。 - mh1
@Nouphal.M 我正在使用真正的iPad版本5.1.1。 - mh1
@Rajnish,我应该在config.php文件中寻找什么?另外,即使CI的CSRF保护关闭,问题仍然存在,所以任何关于CSRF的配置都不应该影响它? - mh1
1个回答

0
你可以看一下这个,这个人发现当服务器上开启Negotiate时会有问题,你可以检查一下你的服务器或添加一些协商的PHP头文件,在HTTP响应中检查你的接受内容并尝试调整它们。可以看一下这个链接。
嗯,是的,我已经做了所有的事情,但是它并没有揭示任何东西,这就是为什么我要求帮助的原因... 我发布的失败请求跟踪只是我有的最具启示性的东西。 在研究我的服务器配置与我们的测试服务器之间的所有差异后,我有点明白了。幸运的是,我有这个区别,并且能够发现它。 身份验证 > 集成 Windows 身份验证 > 高级设置 提供程序 > [Negotiate, NTLM] <-- 无法工作 身份验证 > 集成 Windows 身份验证 > 高级设置 > 提供程序 > [NTLM] <-- 可以工作 看起来这是 Safari 认证堆栈的一个错误,当启用 Negotiate 时,POST 请求主体会被某种方式搞砸。这没有任何意义,为什么会发生这种情况,但是实际上我在 5.1 中看到了很多其他奇怪的身份验证行为。很多时候,但并不总是,当它试图验证页面发出的子请求(CSS/JS/IMG)时,我会得到多个密码提示。我不认为这是 IIS 的 bug,因为每个其他的浏览器,甚至 5.0 都完全正常,加上那个 NTLM 堆栈应该已经被正确实现和稳定维护了很长时间... 除非最近的 Windows 更新在这个领域有所贡献... 至少值得检查一下。周一我会跟进 Safari 的开发人员并看看是否能找到根本问题。 谢谢。

这里是链接 http://forums.iis.net/t/1182376.aspx?IIS7+5+receives+empty+post+body+from+Safari+5+1+

祝你好运!


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