1. 同源策略
所有的浏览器都遵守同源策略,这个策略能够保证一个源的动态脚本不能读取或操作其他源的http响应和cookie,这就使浏览器隔离了来自不同源的内容,防止它们互相操作。所谓同源是指协议、域名和端口都一致的情况。举例来说,首先在Nginx上配置两个虚拟主机,一个监听80端口,另一个监听81端口:
server {
listen 80;
server_name localhost;
location / {
root D:/dev/workspace;
index index.html index.htm;
}
location ~ \.php$ {
# 委托给后端的php
}
}
81端口的server配置是类似的,只是端口不同而已,所以通过80和81端口会访问到相同的东西。写两个php,一个是用于页面展示的show_person.php,另一个是用于生成json数据的person.php。
// person.php
'kobe', 'age' => 34);
echo json_encode($person);
?>
注意show_person.php中通过jQuery的getJSON请求http://localhost:80/MongoTest/person.php,这里是80端口。
然后先访问80端口试试,键入url:http://localhost/cross_domain/show_person.php。会弹出对话框,显示:kobe, your age is 34。
然后再访问81端口,http://localhost:81/cross_domain/show_person.php,结果出错:
XMLHttpRequest cannot loadhttp://localhost/MongoTest/person.php. Origin http://localhost:81 is not allowed by Access-Control-Allow-Origin.
这就是同源策略作用的效果。因为浏览器中访问的是81端口的内容,而show_person.php中请求的是80端口,所以请求的是不同源的内容,浏览器直接阻止这次请求。
2. 打破同源策略的限制
浏览器会阻止ajax请求非同源的内容,但没有限制