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

时间:2016-02-21 05:03:55

标签: javascript jquery ajax

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:8)

嗯,不幸的是,ajax总是遵循重定向。但是,有一个功能在所有浏览器中都不受支持,您可以访问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();
}

<button id="redirect">
  Redirect
</button>
<button id="no-redirect">
  No Redirect
</button>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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

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

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

AJAx调用中返回的数据可能是哈希值,其中一个键表示重定向URL。

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

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

答案 2 :(得分:0)

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

这里我们在网址中注入了 typedef ,因此当点击链接时,浏览器会在网址中有一个新段,代表参数,根据其值,您可以确定哪个要使用相应的AJAX调用加载的页面..

<强> JS / jQuery的:

/#/

<强> HTML:

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');
    }
}

答案 3 :(得分:0)

由于已经提到的responseURL还没有最好的浏览器支持,因此可以使用另外两种替代方案,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
    }

  }
}

缓存

  • 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;
}

答案 4 :(得分:-1)

是的,当您使用Ajax请求http://api.example.com时,浏览器不会重定向。您可以使用jQuery(如bellow

)获取所有响应
std::string s = "hello";
s.erase(0, 1); // position = 0, length = 1
std::cout << s;  //"ello"