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

时间:2012-01-31 22:37:05

标签: jquery post header location

我试图创建一个可以处理表单的弹出框(使用jQuery),而且在大多数情况下,我都可以使用它。我唯一的问题是,在成功登录和/或注册时,PHP会发送一个标题位置,将用户重定向到他们的" home",然后在div中创建一个无限循环的重定向我加载了表单。

如果在帖子请求中发送了location标头,然后获取作为新location发送的实际网址,我将如何阅读?

这是我迄今为止尝试过的事情(其中包括):

$('.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 post请求执行此操作,但没有预期的结果。

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

理想情况下,这就是我想要实现的目标:

$('.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;

        }

    });

});

1 个答案:

答案 0 :(得分:1)

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

因此,如果使用JavaScript(或jQuery)请求页面,我已经编辑了我的PHP脚本中的重定向函数来发送自定义标题。

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;

        }

    });

});