我想使用jQuery获取URL并显式检查它是否以302重定向响应,但不遵循重定向。
jQuery的$.ajax
似乎始终遵循重定向。如何防止这种情况,并在不遵循重定向的情况下查看重定向?
“jquery ajax redirect”这样的标题有各种各样的问题,但它们似乎都涉及完成其他目标,而不是直接检查服务器给出的状态。
答案 0 :(得分:77)
AJAX请求永远不会有机会不遵循重定向(即必须遵循重定向)。有关详细信息,请参阅此答案https://stackoverflow.com/a/2573589/965648
答案 1 :(得分:38)
欢迎来到未来!
现在我们有一个" responseURL"来自xhr对象的属性。 YAY!
请参阅How to get response url in XMLHttpRequest?
但是,jQuery(至少1.7.1)不能直接访问XMLHttpRequest对象。 你可以使用这样的东西:
var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
xhr = _orgAjax();
return xhr;
};
jQuery.ajax('http://test.com', {
success: function(responseText) {
console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
}
});
这不是一个干净的解决方案,我想jQuery团队将在未来的版本中为responseURL做点什么。
提示:只需将原始网址与responseUrl进行比较即可。如果它相等,则不给出重定向。如果它"未定义"然后可能不支持responseUrl。然而,正如Nick Garvey所说,AJAX请求永远不会有机会不遵循重定向,但您可以使用 responseUrl 属性来解决许多任务。
答案 2 :(得分:9)
虽然回答这个问题的其他人(遗憾地)是正确的,浏览器隐藏了这些信息,我想我会发布一个我想出的解决方法:
我将服务器应用配置为设置包含所请求网址的自定义响应标头(X-Response-Url
)。每当我的ajax代码收到响应时,它会检查是否定义了xhr.getResponseHeader("x-response-url")
,在这种情况下,它会将其与最初通过$.ajax()
请求的URL进行比较。如果字符串不同,我知道有一个重定向,另外,我们实际到达的是什么网址。
这确实有一个缺点,需要一些服务器端的帮助,如果在往返期间网址被引导(由于引用/编码问题等),也可能会崩溃...但对于99%的情况,这好像完成了工作。
在服务器端,我的具体案例是使用Pyramid Web框架的python应用程序,我使用了以下代码段:
import pyramid.events
@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
request = event.request
if request.is_xhr:
event.response.headers['X-Response-URL'] = request.url
答案 3 :(得分:0)
您现在可以使用fetch API /它返回redirected: *boolean*