1.跨域原因
当浏览器访问 www.a.com时,tomcat1给返回一个js,用户看不到。这个js通过ajax去调用另一个服务tomcat2,如果能够调的通,那么就危险了。
所以 w3c标准不允许。当ajax调用www.b.com时,请求头里会放置一个变量 origin 即原网址 。tomcat2检测到$http_origin 中的变量 即 原网址是否是本服务,如果不是,则拒绝该访问。
2.如何跨域
常见的跨域方案:
jsonp、 document.domain + iframe 跨域
Cors解决方案(最优雅)
添加header头: Access-Control-Allow-Origin ,表明允许网站执行
1.CORS 介绍
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,
从而克服AJAX只能同源使用的限制。
简单请求:
浏览器在跨源AJAX请求的头信息之中,自动在添加一个Origin字段(本次请求来自哪个源 )。
服务器根据这个值,在许可范围内,则在头信息包含 Access-Control-Allow-Origin 。
upstream nginx {
ip_hash;
server 172.17.0.4:8081 weight=2;
server 172.17.0.5:8081 weight=1;
}
server {
listen 80;
server_name www.enjoy.com;
#匹配正则
if ( $http_origin ~ http://(.*).enjoy.com){
set $allow_url $http_origin;
}
#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin $allow_url;
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
#允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
#P3P支持跨域cookie操作
add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
add_header test 1;
if ($request_method = 'OPTIONS') {
return 204;
}
location / {
root html/static/;
index index.html index.htm;
}
location /rout {
rewrite ^/rout