是否可以通过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
重定向到success
或failure
页面。 我的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); } });