是否可以通过Ajax获取页面重定向信息?

如果没有ajax,如果我们加载http://example.com/1并且它重定向到http://example.com/2则浏览器会获得相应的标题,并且浏览器URL会更新。 有没有办法通过jQuery Ajax获取此信息?

例如,我通过Ajax请求http://api.example.com 。 在PHP中,此页面被重定向到http://api2.example.com 。 有可能知道这件事吗?

使用:我有一个有链接的导航栏。 所有页面都通过AJAX加载到容器中 ,我根据链接使用HTML5历史记录在浏览器栏上推送URL。

但是,如果页面被重定向,页面会有一个新链接吗? 我想在浏览器栏中更改它。 我想知道重定向Ajax URL的位置,以防重定向。

为什么这很重要? 我的链接处理表单数据,请求和各种身份validation。 例如,如果我请求, https://oauth.example.org?code=56hycf86重定向到successfailure页面。 我的Ajax获得正确的html内容,但URL浏览器栏仍然具有相同的Auth ID的URL,如果重新加载,则会产生错误。 还有其他安全问题。

我不知道我是否解释了正确的事情,但谢谢你的帮助。

好吧,不幸的是,ajax总是遵循重定向。 但是,有一个function在所有浏览器中都不受支持,您可以访问XMLHttpRequest对象的responseURL属性。

您可以在下面的代码段中尝试它。 重定向按钮将ajax请求发送到回复1重定向的URL(如果有多个重定向,它也可以工作)。 no redirect按钮将ajax请求发送到没有重定向的URL。

据我所知,IE 11和旧版本的chrome / firefox / opera浏览器不支持此方法。

 document.getElementById("no-redirect").addEventListener("click", function() { testRedirect("https://httpbin.org/get"); }); document.getElementById("redirect").addEventListener("click", function() { testRedirect("https://httpbin.org/redirect/1"); }); function testRedirect(url) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(e) { if (xhr.status == 200 && xhr.readyState == 4) { if (url != xhr.responseURL) { alert("redirect detected to: " + xhr.responseURL) } else { alert("no redirect detected") } } } xhr.open("GET", url, true); xhr.send(); } 
   

这可能不是您正在寻找的,但也许它会帮助您获得类似的效果。

如果您可以控制http://api.example.com执行的页面,则可以通过AJAX更改其响应方式。

您可以在AJAX调用中包含一个变量,将其标记为此类调用,如果存在此变量,则不会重定向到其他页面,但在答案中包含它将重定向到的URL。

AJAx调用中返回的数据可以是散列,其中一个键表示重定向URL。

 data = {status => 1, redirect => 'http://ap2.example.com', …} 

(对不起,如果那不是有效的PHP哈希)

不确定我是否理解它,但只是尝试了一些东西,如果它不是你想要的,请通知我删除答案。

在这里我们在URL中注入这个/#/所以当点击链接时,浏览器会在URL中有一个新的段,表示参数,根据它的值,你可以使用相应的AJAX调用确定要加载的页面。

JS / jQuery的:

 var navLinks = $('#nav a'), params = [], baseURL = '//localhost/test/js-url-parameters-second'; navLinks.each(function(){ var oldHREF = $(this).attr('href'); $(this).attr('href', baseURL +'/#/'+ oldHREF); }); navLinks.on('click', function(){ checkURL($(this).attr('href')); }); function checkURL(docURL){ // if /#/ found then we have URL parameters // grabbing the parameters part of the URL if(docURL.indexOf('/#/') > -1){ docURL = docURL.split('/#/')[1]; if(docURL != ''){ // omit the last forward slash if exists if(docURL[docURL.length - 1] == '/'){ docURL = docURL.substring(0, docURL.length - 1); } console.log(docURL); $('#page-type').text(docURL); } } else { console.log('No URL parameters found'); } } 

HTML:

  
this is the Home page

正如已经提到的responseURL还没有最好的浏览器支持,还有2个可以使用的替代方案,http请求标头和cookie。

这些的好处是它们不会干扰内容本身,例如查询字符串键,哈希标记或嵌入在响应数据中。


请求标头

服务器端

  • PHP

     $req->addHeader("X-Response-Url", "...."); 
  • ASP

     headers.Add("X-Response-Url", "...."); 

客户端

 xhr.onreadystatechange = function(e) { if (xhr.status == 200 && xhr.readyState == 4) { var resp_url = xhr.getResponseHeader("X-Response-Url"); if (send_url != resp_url) { // redirected } } } 

cookies

  • PHP

     setcookie("XResponseUrl", "..."); 
  • ASP

     Response.Cookies("XResponseUrl") = "..." 

客户端

 xhr.onreadystatechange = function(e) { if (xhr.status == 200 && xhr.readyState == 4) { var resp_url = getCookie("XResponseUrl"); if (send_url != resp_url) { // redirected } } } function getCookie(name) { var re = new RegExp(name + "=([^;]+)"); var value = re.exec(document.cookie); return (value != null) ? unescape(value[1]) : null; } 

是的,当您使用Ajax请求http://api.example.com时,浏览器不会重定向。 您可以使用jQuery之类的方式获得所有响应

 $.ajax({ url: "http://api.example.com", success: function(data, textStatus, xhr) { console.log(xhr.status); }, complete: function(xhr, textStatus) { console.log(xhr.status); } });