Cross-domain POST request ajax in internet explorer
我正在使用jquery 1.7.2,并希望向另一个域发出POST请求。它必须是一个POST请求。但这在Internet Explorer中不起作用(我在IE9上尝试过);它适用于所有其他浏览器。
我有这个剧本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | jQuery.support.cors = true; jQuery(function() { $.ajax({ crossDomain : true, cache: false, type: 'POST', url: 'http://someotherdomain/test.php', data: {}, success: function(da) { console.log(JSON.stringify(da)) }, error: function(jqxhr) { console.log('fail') console.log(JSON.stringify(jqxhr)) }, dataType: 'json' }); }); |
我收回错误:
1 2 3 | {"readyState":0,"status":0,"statusText":"Error: Access denied. "} |
我的php文件如下:
1 2 3 4 | <?php header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS'); echo json_decode(array('success' => 'yes')); |
要支持IE<10中的CORS,必须修改Ajax方法以使用xdomainRequest对象。这个插件为你做的:https://github.com/jaubourg/ajaxhooks
Internet Explorer(包括IE9)不支持CORS。您必须代理所有跨域请求(发布到同一域上的PHP脚本,该脚本使用curl返回查询并返回响应)
你的剧本看起来不错,但我相信你需要改变:
1 | header('Access-Control-Allow-Origin: *'); |
到
1 | header('Access-Control-Allow-Origin: x-requested-with'); |
或
1 | header('Access-Control-Allow-Origin: {Origin}'); |
其中origin是origin头的值。我的理解是,如果给出了一个原点,那么仅仅输入"*"就行不通了。
此外,IE8和IE9对此的支持是有限的,但是如果您像您所做的那样放置
这在IE9中有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!DOCTYPE html> <head> <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"> <script language="javascript" type="text/javascript"> var url ="http://msdn.microsoft.com/en-us/library/windows/desktop/ms759148(v=vs.85).aspx"; function getRequest() { try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {alert("Error while getting 6.0");} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {alert("Error while getting 3.0");} try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {alert("Error while getting 2.0");} throw new Error("This browser does not support XMLHttpRequest."); }; var request = getRequest(); request.open("POST", url, false); request.send(); alert("Content from :"+url+":"+ request.responseText); </head> AJAX ActiveX |