做商务网站公司,企业网站界面 优帮云,公司托管,制作网站需要多少钱一、什么是跨域
跨域#xff1a;由于浏览器的同源策略#xff0c;即属于不同域的页面之间不能相互访问各自的页面内容。详细见下表#xff1a;
注#xff1a;同源策略#xff0c;单说来就是同协议#xff0c;同域名#xff0c;同端口 URL说明是否允许通信http://www.a…一、什么是跨域
跨域由于浏览器的同源策略即属于不同域的页面之间不能相互访问各自的页面内容。详细见下表
注同源策略单说来就是同协议同域名同端口 URL说明是否允许通信http://www.a.com/a.js http://www.a.com/b.js同一域名下允许http://www.a.com/lab/a.js http://www.a.com/script/b.js同一域名下不同文件夹允许http://www.a.com:8000/a.js http://www.a.com/b.js同一域名不同端口不允许http://www.a.com/a.js https://www.a.com/b.js同一域名不同协议不允许http://www.a.com/a.js http://70.32.92.74/b.js域名和域名对应ip不允许http://www.a.com/a.js http://script.a.com/b.js主域相同子域不同不允许http://www.a.com/a.js http://a.com/b.js同一域名不同二级域名同上不允许cookie这种情况下也不允许访问http://www.cnblogs.com/a.js http://www.a.com/b.js不同域名不允许二、为什么要跨域 出于安全考虑比如csrf攻击浏览器一般会禁止进行跨域访问但是因为有时有相应需求需要允许跨域访问这时我们就需要将跨域访问限制打开。
比如Ajax请求另一个域名获取数据
当前网站www.kk.com 请求另一网站接口 www.oo.com/getuser/uid/220305 获取user数据 三、跨域的实现 1、前后端结合JsonP
虽然jsonp也可以实现跨域但是因为jsonp不支持post请求应用场景受到很大限制所以这里不对jsonp作介绍。
了解jsonp实现跨域可以点击这里
https://blog.csdn.net/u014607184/article/details/52027879/ 2、纯后端方式一CORS方式
CORS 是w3c标准的方式通过在web服务器端设置响应头Access-Cntrol-Alow-Origin 来指定哪些域可以访问本域的数据ie89(XDomainRequest)10,chrom4firefox3.5,safair4opera12支持这种方式。
服务器代理同源策略只存在浏览器端通过服务器转发请求可以达到跨域请求的目的劣势增加服务器的负担且访问速度慢。
这种方式直接在响应php文件中设置header即可 示例代码
?php
header(Access-Control-Allow-Origin:http://www.kk.com);
$data array(namem_nanle_xiaobudiu,age26,sexman
);
echo json_encode($data); 当我们需要允许多个域名跨域访问时可以这样做
?php
$origin isset($_SERVER[HTTP_ORIGIN])? $_SERVER[HTTP_ORIGIN] : ;$allow_origin array(http://www.kk.com,http://www.gg.com
);if(in_array($origin, $allow_origin)){header(Access-Control-Allow-Origin:.$origin);
}
$data array(namem_nanle_xiaobudiu,age26,sexman
);
echo json_encode($data); 3、纯后端方式二Nginx代理方式【建议这种方式】
直接在nginx服务器上设置模块参数。
—— 代码实现 html部分www.kk.com
html langen
headmeta charsetUTF-8 /title测试ajax和跨域访问/titlescript srchttp://libs.baidu.com/jquery/2.1.4/jquery.min.js/script
/head
script typetext/javascript$(document).ready(function(){$.ajax({type: post,url: http://www.oo.com/1.php,success: function(data) {alert(data);},error: function() {alert(fail!!!,请刷新再试!);}});});
/script
body
h1测试跨域访问/h1
/body
/html php部分www.oo.com
?php
$data array(namem_nanle_xiaobudiu,age26,sexman
);
echo json_encode($data); Nginx配置文件部分、
server {listen 80;server_name www.oo.com ;root G:\oo;add_header Access-Control-Allow-Origin http://www.kk.com;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;location / {index index.html index.htm index.php;#autoindex on;}location ~ \.php(.*)$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_split_path_info ^((?U).\.php)(/?.)$;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;include fastcgi_params;}}注实际项目中可能我们提供的接口需要允许不止一个域名访问这时我们需要配置允许多个域名访问这时我们可以用map
示例
map $http_origin $corsHost {default 0;~http://www.kk.com http://www.kk.com;~http://www.gg.com http://www.gg.com;
}
server {listen 80;server_name www.oo.com ;root G:\oo;add_header Access-Control-Allow-Origin $corsHost;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;location / {index index.html index.htm index.php;#autoindex on;}location ~ \.php(.*)$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_split_path_info ^((?U).\.php)(/?.)$;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;include fastcgi_params;}
}