通过node.js模块发送的HTTPS请求与
XMLHttpRequest之间有什么区别?
我正在尝试向amazon aws发送HTTPS GET请求以从javascript(XMLHttpRequest)获取安全令牌,并且始终失败并且“Access-Control-Allow-Origin不允许使用Origin http://my_ip”,但是如果我发送相同的HTTPS GET通过node.js模块请求它工作正常.
我对此感到困惑,因为如果服务器确实支持CORS,那么来自任何地方的任何请求都应该失败,但是它通过node.js,但不是通过XMLHttpRequest.
这个失败
var url_ = "https://sts.amazonaws.com/?Action=GetSessionToken" + "&DurationSeconds=3600" + "&AWSAccessKeyId=XXXXXXXXXXXXXXX" + "&Version=2011-06-15" + "&Timestamp=" + encode(timestamp) + "&Signature=" + encode(hash) + "&SignatureVersion=2&SignatureMethod=HmacSHA256"; // Simple GET request $.get(url_,function(data) { alert("response: " + data); });
这个工作
var https = require('https'); var options = { host : 'sts.amazonaws.com',method : 'GET',path : '/?Action=GetSessionToken' + '&DurationSeconds=3600' + '&AWSAccessKeyId=XXXXXXXXXXXXXX' + '&Version=2011-06-15' + '&' + timestamp + '&' + signature + '&SignatureVersion=2&SignatureMethod=HmacSHA256' }; https.get(options,function(res) { res.on('data',function(d) { process.stdout.write(d); }); }).on('error',function(e) { console.error(e); });
有谁能解释我这是如何工作的?
解决方法
浏览器受
Same Origin Policy的限制.Node.js不受限制.
也就是说,浏览器将允许脚本通过XHR仅向与加载脚本的页面相同的域中的站点发出HTTP请求.但是,Node.js将允许对任何域的HTTP请求.
(现在使用CORS的浏览器故事稍微复杂一些,但它仍然是这里的基本问题.)
编辑 – 详细说明,现在我已经重新阅读了你的问题:CORS是一个合作协议.互联网上的服务器通常会向任何人提供内容;这就是运行Web服务器的重点.除非请求者询问,否则CORS与HTTP请求无关.如果您有URL“http://x.y.z/something”,并将其输入浏览器的地址栏,那么浏览器将毫不犹豫地向该站点发出HTTP请求.当来自另一个域(而不是“x.y.z”)的站点的页面中的某些代码尝试通过XHR运行HTTP请求时,同源策略(和CORS)才会发挥作用.在这种情况下,浏览器会向“x.y.z”网站询问访问权限;默认答案是“否”,但这是浏览器强制执行该规则,而不是服务器.