重要提示:如果另一端的服务器没有启用,您无法在客户端代码中执行任何操作以允许跨源ajax请求。
在回答您的问题之前,让我先给您介绍一下背景:
简而言之,同源安全策略确保来自一个源的脚本不能获取其他来源的内容。现在,为了向您解释“源”的概念,让我引用Wikipedia Same-Origin Security Policy文章的部分内容:
The following table gives an overview of typical outcomes for checks against the URL "http://www.example.com/dir/page.html".
Compared URL Outcome Reason
------------------------------------------------------- ------- ----------------------
http://www.example.com/dir/page2.html Success Same protocol and host
http://www.example.com/dir2/other.html Success Same protocol and host
http://username:password@www.example.com/dir2/other.html Success Same protocol and host
http://www.example.com:81/dir/other.html Failure Same protocol and host but different port
https://www.example.com/dir/other.html Failure Different protocol
http://en.example.com/dir/other.html Failure Different host
http://example.com/dir/other.html Failure Different host (exact match required)
http://v2.www.example.com/dir/other.html Failure Different host (exact match required)
http://www.example.com:80/dir/other.html Depends Port explicit. Depends on implementation in browser.
Unlike other browsers, Internet Explorer does not include the port in the calculation of the origin, using the Security Zone in its place.
因此,例如,您的JavaScript不能从其他服务器下载任何内容(也就是说,向Web服务器发出HTTP请求)。这正是为什么您无法对其他域进行XmlHttpRequests(也称为AJAX)的原因。
CORS是服务器端(而非浏览器中的客户端代码)可以
放宽同源策略的一种方式。
跨域资源共享(CORS)的简单描述:
引用块:
CORS标准通过添加新的HTTP头来允许服务器向允许的源域提供资源。浏览器支持这些头并遵守它们所建立的限制。
示例:假设您的网站是
http://my-cool-site.com
,并且您有一个第三方API在域
http://third-party-site.com
上,您可以通过AJAX访问它。
假设来自您的服务器
my-cool-site.com
的页面向
third-party-site.com
发出请求。通常情况下,用户的浏览器会拒绝对除自己的域/子域之外的任何其他站点的AJAX调用,根据
同源安全策略。但如果浏览器和第三方服务器支持CORS,则会发生以下事情:
Browser will send and Origin
HTTP header to third-party-site.com
Origin: http://my-cool-site.com
If the third party server accepts requests from your domain, it will respond with an Access-Control-Allow-Origin
HTTP header:
Access-Control-Allow-Origin: http://my-cool-site.com
To allow all domains, third party server can send this header:
Access-Control-Allow-Origin: *
If your site is not allowed, browser will throw an error.
如果客户端使用 支持CORS的现代浏览器,并且你的第三方服务器也支持CORS,那么CORS对你很有用。
在一些过时的浏览器中(例如IE8),你必须使用Microsoft特定的XDomainRequest
对象来替代XMLHttpRequest
,以便能够正确地使用CORS进行调用;不过这已经过时了,所有现代浏览器(包括微软的浏览器)都将CORS处理为XMLHttpRequest
。但如果你需要支持过时的浏览器,该页面描述了如何实现它:
To make a CORS request you simply use XMLHttpRequest
in Firefox 3.5+, Safari 4+ and Chrome and XDomainRequest
object in IE8+. When using XMLHttpRequest
object, if the browser sees that you are trying to make a cross-domain request it will seamlessly trigger CORS behaviour.
Here is a javascript function that helps you create a cross browser CORS object.
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
再次强调,这仅适用于过时的浏览器。
上述原因是为什么你不能从脚本中使用亚马逊的网络服务。亚马逊服务器只允许从选定的域名提供的页面下载其JavaScript文件。
回答您的编号问题:
1. 如果文件与当前源相同,则浏览器将下载该文件。
2. 如果不在同一源中,则如果CORS请求成功,文件将被下载。
3. 否则,下载脚本将失败。
4. 如果下载成功,则JavaScript文件的内容将加载到浏览器的内存中进行解释和执行。
有关CORS的说明,请参见描述。
<script>
标签加载的JavaScript文件的URL没有影响。 - Pointy<script>
标签加载JavaScript时,实际上会获取该文件并在客户端上运行。 - Pointy