微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 通过常规表单提交或Ajax请求访问时使浏览器重定向的表单 – 这可能吗?

我有一个带有表单的网页.当用户提交表单时,我希望服务器使浏览器重定向到表单操作的不同页面.现在,我通过使用PHPheader函数来发送302状态代码.它工作正常.

我试图让服务器上的页面以相同的方式重定向浏览器,无论它是否正常提交(没有Javascript)或通过Ajax.我尝试通过将窗口位置设置为Location头中的任何URL来实现此目的.我正在使用jQuery,并进行如下调用

$.ajax({
    url: this.action,
    type: "POST",
    data: getFormData(this),
    complete: function(request) {
        window.location.assign(request.getResponseHeader("Location"));
    }
});

但是,这没有用.在考虑之后,我意识到这并不是很令人惊讶.在Ajax请求中,浏览器应该在更改readyState之前透明地处理重定向响应,例如302代码.当完整函数运行时,它正在查找最终目标中的Location标头而未找到它.

作为实验,我尝试使用Location标头发送200状态代码.我尝试了Ajax请求,它工作正常.但是,当我执行非Ajax提交时,它不起作用.浏览器转到表单操作页面并保持在那里,就像它忽略了Location标题一样.

有没有办法在两种情况下都使同一页面重定向,而服务器不必知道或关心请求是否是Ajax请求?

如果这很重要,我在各种浏览器(IE8,IE7,IE6,Firefox 3.5,Chrome)中尝试了表格,每次都有类似的结果.此外,我正在做一个帖子请求,以避免碰到IE的2083字符URL长度限制.

解决方法:

HTTP 302 response are consumed silently by XmlHttpRequest implementations(例如jQuery的ajax函数).这是一个功能.

我过去解决这个问题的方法是检测XmlHttpRequests并发出"Content-Location" header(而不是“Location”标题).最常见的跨库工作方式是检查服务器端代码中的“X-Requested-With”http头(jQuery,Prototype,Mootools等设置此代码):

if (@$_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest') {
    header('Content-Location: ' . $redirect_url);
} else {
    header('Location: ' . $redirect_url);
}

您仍然需要特殊情况下的客户端代码

$.ajax({
    // ...
    complete: function(xhr) {
        var redirect_url = xhr.getResponseHeader("Content-Location");
        if (redirect_url) {
            window.location = redirect_url;
        }
    }
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐