如何使用jQuery的$.post函数获取"location"标头?



我正在尝试创建一个可以处理表单的弹出框(使用jQuery),在大多数情况下,我已经完成了这一切。我唯一的问题是,在成功登录和/或注册后,PHP会发送一个标头位置,将用户重定向到他们的"主页",并在我加载表单的div中创建一个无休止的重定向循环。

如果在post请求中发送了location标头,然后获取作为新location发送的实际URL,我该如何阅读?

这是我迄今为止所尝试的(除其他外):

$('.register').live('submit', function(e) {
    e.preventDefault();
    var form_data = $(this).serialize() + '&register=register&js=true';
    $.post(site_path + '/register', form_data, function(data, text, xhr) {
        alert(xhr.getResponseHeader("Location"));
        // $('.overlay_container').html(data);
    });
});

不确定我到底做错了什么,但据我所知,沿着这些思路应该会奏效。我还试着用一个简单的AJAX帖子请求来做这件事,但没有预期的结果。

需要注意的是,不会总是发送位置标头;只有当某人成功登录、注册等时

理想情况下,这就是我正在努力实现的目标:

$('.register').live('submit', function(e) {
    e.preventDefault();
    var form_data = $(this).serialize() + '&register=register&js=true';
    $.post(site_path + '/register', form_data, function(data, text, xhr) {
        var header_location = xhr.getResponseHeader("Location");
        if(header_location == null) {
            $('.overlay_container').html(data);
        }else{
            window.location = header_location;
        }
    });
});

据我所知,您实际上无法读取Location标头,因为JavaScript会一直跟着它,直到它们停止,然后将headers发回,这意味着我得到的是目标页面的标头,而不是最初发布到的页面。

因此,我编辑了PHP脚本中的重定向函数,以便在使用JavaScript(或jQuery)请求页面时发送自定义标头。

public function redirect($redirect = NULL) {
    global $_CONFIG;
    if($_POST['js'] == 'true') {
        exit(header('Redirect: ' . $_CONFIG['site']['path'] . '/' . $redirect));
    }else{
        exit(header('Location: ' . $_CONFIG['site']['path'] . '/' . $redirect));
    }
}

这样,我就可以读取是否真的发送了重定向,并在JavaScript(jQuery)端正确处理它。

以下是最终结果:

$('.popup').on('submit', '.register', function(e) {
    e.preventDefault();
    var action = $(this).attr('action'), form_data = $(this).serialize() + '&register=register&js=true';
    $.post(action, form_data, function(data, text, xhr) {
        var header_location = xhr.getResponseHeader('Redirect');
        if(header_location == null) {
            $('.overlay_container').html(data);
        }else{
            window.location = header_location;
        }
    });
});

最新更新