在 Internet Explorer 9 中更改域名后,Ajax 停止工作
Posted
技术标签:
【中文标题】在 Internet Explorer 9 中更改域名后,Ajax 停止工作【英文标题】:Ajax stops working after changing domain name in internet explorer 9 【发布时间】:2013-09-27 23:56:57 【问题描述】:我们正在使用 html5、jQuery(1.8.2) 和 jQuery mobile 开发移动网站,同时进行 jQuery ajax 调用(获取和发布)。
更改域名后,我们在 ie9 上的 ajax 调用被“拒绝访问”。
我们试图包含jquery.iecors.js
。但是我们仍然遇到同样的错误。有什么解决办法吗?
示例代码:
$.support.cors = true;
$.ajax(
cache: false,
async: true,
crossDomain: true,
timeout: 600000,
url: baseUrl + '/SmartTouch/restServices/PrefferedHotels',
type: 'GET',
beforeSend: function (xhr)
xhr.setRequestHeader("Authorization", "Basic " + myencoded);
,
contentType: "application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8",
success: function (data)
alert("success");
,
error: function (jqXHR, textStatus, errorThrown)
alert("error!!::" + JSON.stringify(jqXHR));
alert('response: ' + jqXHR.responseText);
alert('code: ' + jqXHR.getResponseHeader('X-Subscriber-Status'));
alert("textStatus " + textStatus);
alert("errorThrown " + errorThrown);
);
已编辑:
beforeSend: function (xhr)
xhr.setRequestHeader("Authorization", "Basic " + myencoded);
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
,
contentType: "application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8",
success: function (data)
alert("success");
,
error: function (jqXHR, textStatus, errorThrown)
alert("error!!::" + JSON.stringify(jqXHR));
IE9 中的请求和响应标头:
Request:
Key Value
Request GET url HTTP/1.1
Accept text/html, application/xhtml+xml, */*
Accept-Language en-US
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding gzip, deflate
Proxy-Connection Keep-Alive
Host ("url")
Pragma no-cache
Cookie GUEST_LANGUAGE_ID=en_US; COOKIE_SUPPORT=true; __utmc=24444716; __utma=24444716.47018335.1379597653.1380274476.1380276859.17; __utmz=24444716.1379597653.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=24444716.6.10.1380276859
Response:
Key Value
Response HTTP/1.1 200 OK
Server Apache-Coyote/1.1
X-Powered-By Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Accept-Ranges bytes
ETag W/"64578-1380266616000"
Last-Modified Fri, 27 Sep 2013 07:23:36 GMT
Content-Type text/html
Date Fri, 27 Sep 2013 10:17:01 GMT
Content-Length 64578
Age 0
Via 1.1 localhost.localdomain
【问题讨论】:
baseUrl
是硬编码的吗?还是从 html 输出中获取?
你检查你对那个域(服务器)的授权没有错吗? myencoded
这个变量包含的内容是正确的?
baseUrl 是硬编码的。我能够在包括ie10在内的其他浏览器中成功进行ajax调用。所以我认为授权不是问题。
好像这里给出了答案:***.com/questions/10232017/…
@ Vytautas 我们已经尝试了此链接中给出的所有选项,但没有任何效果。我们的问题是我们正在进行基本授权并包括以下标头:xhr.setRequestHeader("Authorization", "Basic" +我的编码);在我们的 ajax 调用中。但是在 ie9 中,我们访问被拒绝。有什么方法可以包含这个标头吗?
【参考方案1】:
如果您希望 Ajax url 从任何域命中,服务器必须发送响应头 Access-Control-Allow-Origin : * 或 Access-Control-Allow-Origin : your-domain 如果仅限于您的域。您能看到这些标头作为响应吗?
【讨论】:
因为他们可以在其他浏览器中得到正确的响应;恕我直言,这可能不是问题。 Ok.In ie9,你得到什么响应?或者您甚至无法获得 Request 被击中? 请求未命中。 查看@Maz 提供的链接,我认为这是问题所在。 我已经添加了这个js文件。但是仍然出现这个错误。我需要对ajax请求进行任何更改吗?【参考方案2】:如果您使用的是基于 Windows 的主机?
请检查 IIS 的旧配置(如果有)
有安全规定允许内容按其类型,
在您的页面中添加此响应标头<% Response.AddHeader("Access-Control-Allow-Origin","*") %>
。
或参考source link to MSDN了解更多详情
我认为您已在编辑中对此进行了更新,但其中涉及 AJAX 的内容很多,如果您更改了安全选项而不是默认设置,您的 IE9 也可能是原因之一。
我觉得应该可以,如果不行请回复
【讨论】:
【参考方案3】:这种Content-Type
看起来很奇怪:
application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8"
我可以想象 IE 也有问题。
尝试正确的:
application/x-www-form-urlencoded; charset=UTF-8
^-- notice: no dot!
IE也有可能出现授权问题。
也许myencoded
超出范围或未正确填写。调试这个变量,看看这个问题:Authorization through setRequestHeader
【讨论】:
我想不出myencoded
可以在其他浏览器而非IE9 上正确限定范围的场景。但话又说回来,它是 IE。 +1 确认我对Content-Type
的怀疑 :)【参考方案4】:
您似乎确信该问题与建议的 jQuery 错误无关(尤其是因为您使用的是jquery.iecors.js
)所以我会继续前进。
“已编辑”位的意义是什么? Access-Control-Allow-Origin:*
应该在响应上设置(即服务器端,作为 Apache/IIS/F5 配置的一部分),而不是在请求上。 编辑:MDN 上有更多信息;如果您无法立即访问配置更改(在企业环境中很常见),您还可以使用类似 burp 的篡改代理来处理标头。
即使不是问题,@DanFromGermany 也绝对正确 - 内容类型 确实 看起来很奇怪。您甚至不必手动设置它,jQuery.ajax()
默认设置正确。
您似乎还关心设置基本身份验证标头。请记住,myencoded
值只是编码(未加密),因此您不妨跳过标头和pass credentials in the URL:http(s)://username:password@www.example.com/
摩尔编辑:
浏览上面的那些 MDN 文档,this seems relevant:
默认情况下,在跨站点 XMLHttpRequest 调用中,浏览器会 不发送凭据。一个特定的标志必须设置在 调用 XMLHttpRequest 对象时。
也许尝试将xhr.withCredentials = true;
添加到您的beforeSend
?
重要提示:在响应凭证请求时,服务器必须指定域,并且不能使用通配符。上面的例子 如果标头被通配符为: 访问控制允许来源:*。由于访问控制允许来源 明确提到http://foo.example,凭证认知 内容返回到调用的网页内容。
这将使之前在标题中使用星号的建议无效(即需要显式域)
【讨论】:
@o.v.我们究竟需要在哪里设置服务器端的标头?我们如何在响应中设置它?在我们的例子中响应是 json。【参考方案5】:请参阅这篇关于在 IE8 和 IE9 上实现 CORS 的 Microsoft 文章:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
他们具体说了两件事:
不得将自定义标头添加到请求中和
不会随请求发送身份验证或 cookie你在评论中提到:
我们的问题是我们正在做基本授权并包括以下标题: xhr.setRequestHeader("Authorization", "Basic " + myencoded);在我们的 ajax 调用中。但是在 ie9 中,我们访问被拒绝。有什么方法可以包含此标头吗?
很遗憾,我必须给你的答案是否定的,没有办法在 IE8 或 IE9 中包含此标头。微软就是这样设计的。
要让它在 IE9 上与 CORS 一起使用,您必须说服您要连接的站点允许您以其他方式发送授权信息 - 可能是查询参数或发布数据。
如果站点不合作,则始终存在请求代理解决方法,您可以在其中请求服务器上的页面,并且服务器使用正确的标头等转发请求。
【讨论】:
【参考方案6】:你可以试试这个
<meta http-equiv="X-UA-Compatible" content="IE=Edge" >
它强制浏览器以最新版本的标准进行渲染。供参考http://msdn.microsoft.com/en-us/library/ie/ms533876%28v=vs.85%29.aspx
【讨论】:
@Shafeeq 我也添加了这个。但没有运气以上是关于在 Internet Explorer 9 中更改域名后,Ajax 停止工作的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的表单不能在 Internet Explorer 9 中上传文件?
在 Internet Explorer 9 中进行 Dart HTML5 拖放
在 Internet Explorer 9+ 中使用 IUIAutomation 自动另存为文件
Internet Explorer <= 9 中的 AngularJS $http.post 错误