如果没有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
它会重定向到success
或failure
页面。我的Ajax获得正确的html内容,但URL浏览器栏仍然具有相同Auth ID
的URL,如果重新加载,则会产生错误。还有其他安全问题。
我不知道我是否解释了正确的事情,但感谢您的帮助。
答案 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;
答案 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"