如何处理状态码302?

4
当我使用以下代码从我的服务器执行简单的XML HTTP请求时:
var targetUrl = "http://server/Service1.svc?input1=uno&input2=duo";
document.getElementById("console").innerHTML += "<br>commencing";

var xhr = new XMLHttpRequest();
xhr.onload = function () {
  document.getElementById("console").innerHTML += "<br>callbacking";
  alert(xhr.responseText);
}

xhr.open("GET", targetUrl);
document.getElementById("console").innerHTML += "<br>finishing";

xhr.send();

我在FireBug控制台中获得状态码302。根据这篇W3文章,状态码302表示资源被暂时重定向。但我不确定这对我的情况意味着什么,因为当我在FireFox中输入我的URL时,我得到了正常的响应,看起来很好。
有许多关于此问题的文章,但我无法搞清楚。例如,这篇文章只是重申了状态码的定义。这篇文章建议使用HEAD而不是GET,但在我的情况下这不是一个选择(除非绝对必要)。这里甚至声称状态码302自动将页面正确重定向到移动的地方(结果状态码为200),但在我的情况下并不是这样。
我尝试查看xhr.getRespoonseHeader("Content-Type"),但显然它是null
我陷入了困境。我该怎么处理我的问题?

2
你是否有一个htaccess将非www重定向到www? - MrCode
3
你有没有用 Fiddler 这样的工具看一下发生了什么?我猜测你的服务器正在纠正网址,但是如果没有看到代码或实时演示,很难说清楚。 - epascarello
@MrCode 不确定。我没有明确设置过,也不知道如何检查它是否默认启用(安装?)。我们是在谈论服务器端(我会有一些更改问题)还是客户端(我有完全自由的行动)? - user1672517
@epascarello 不是Fiddler,只有FireBug。代码已发布在我的问题更新中。我之前没有这样做是因为我不想成为那个发布所有内容并说“请帮忙”的人。我想从中学习,你懂的。我只是意识到我需要一点推动。也许不是那么轻微... :) - user1672517
2
@CRMconfusee 你可以通过服务器上的.htaccess文件的存在来判断 - 它将是一个包含重定向和其他小好处“规则”的纯文本文件,通常情况下你无法从客户端看出来。我已经给了你的问题一个+1,因为这是一个有趣的问题,但最重要的是 - 我真的很欣赏你在最后一条评论中的态度。看到有人不想成为那种人真是令人耳目一新。;) - Fergus In London
@FergusMorrow 我对服务器的访问权限非常有限,因此我将无法检查该文件是否存在(除非它可以通过例如http://server/beep.htaccess或某些远程可用设施进行查看)。假设(a)存在这样的文件,且(b)不存在这样的文件-我该如何分析、调试和解决我的问题?任何建议都将在这一点上非常有帮助。我会在问题上放置赏金,但我缺乏声望,仍然... - user1672517
2个回答

2

看起来你的服务器可能是:

  • 将非www的http://重定向到www的http://www.
  • 将不安全的HTTP http://重定向到安全的HTTPS https://

在你的网页浏览器中,查看http://server/Service1.svc?input1=uno&input2=duo并观察地址栏。它是否发生了任何变化?检查是否添加了wwwhttps

你也可以将你的javascript URL更改为www版本和https版本,以查看是否有任何修复。

编辑:根据你关于https的说法,我认为它正在将http重定向到https。你的ajax代码不正确,这就解释了为什么回调函数无法正常工作。

你需要使用onreadystatechange事件(而不是onload)并检查状态4,这意味着它已经完成了:

xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
            document.getElementById("console").innerHTML += "<br>callbacking";
            alert(xhr.responseText);
    }
}
xhr.open("GET", targetUrl, true);
xhr.send(null); 

我正在使用无www和无s-in-http版本的URL行进行调用。您是说服务器可能会将这样的调用重定向到另一个安全/带有www的资源吗? - user1672517
我已经测试了更改。切换到 www 前缀没有任何区别。切换到 https 的唯一区别是响应头不显示。在任何情况下都不会执行回调...这是否可以通过 JS 进行管理,还是需要通过请求服务器管理员更改某些配置来处理它? - user1672517
@CRMconfusee,请查看我的编辑。您的服务器必须重定向到https。 - MrCode

1

这可能与IIS服务器上的某些内部重定向有关。我还会检查服务是否安装在应用程序池中。

此外,可能是协议切换或域模糊(即安全/非安全http和/或带/不带w3前缀)之类的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接