JavaScript
实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol
,主机 host
和端口号 port
则就会造成 跨域场景的跨域场景有哪些,请参考下表
nginx
反向代理实现跨域,是最简单的跨域方式nginx
的配置即可解决跨域问题,支持所有浏览器,支持session
,不需要修改任何代码,并且不会影响服务器性能// nginx配置 server { listen 81; server_name www.domain1.com; location / { proxy_pass http://www.domain2.com:8080; #反向代理 proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名 index index.html index.htm; # 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用 add_header Access-Control-Allow-Origin http://www.domain1.com; #当前端只跨域不带cookie时,可为* add_header Access-Control-Allow-Credentials true; } }
jsonp请求
jsonp
是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好 兼容低版本IE
,缺点是只支持 get
请求,不支持 post
请求<script>
元素,向服务器请求 json
数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来//jquery实现 <script> $.getJSON("http://autofelix.com/api.php&callback=?", function(res) { // 处理获得的数据 console.log(res) }); </script>
http://www.autofelix.cn
需要调用 http://api.autofelix.cn/userinfo
去获取用户数据,因为子域名不同,会有跨域限制http://www.autofelix.cn
下的 php
文件,比如 http://www.autofelix.cn/api.php
,然后再通过该 php
文件返回数据// api.php 文件中的代码 public function getCurl($url, $timeout = 5) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $result = curl_exec($ch); curl_close($ch); return $result; } $result = getCurl("http://api.autofelix.cn/userinfo"); return $result;
php
作为案例// 允许所有域名访问 header("Access-Control-Allow-Origin: *"); // 允许单个域名访问 header("Access-Control-Allow-Origin: https://autofelix.com"); // 允许多个自定义域名访问 static public $originarr = [ "https://autofelix.com", "https://baidu.com", "https://csdn.net", ]; // 获取当前跨域域名 $origin = isset($_SERVER["HTTP_ORIGIN"]) ? $_SERVER["HTTP_ORIGIN"] : ""; if (in_array($origin, self::$originarr)) { // 允许 $originarr 数组内的 域名跨域访问 header("Access-Control-Allow-Origin:" . $origin); // 响应类型 header("Access-Control-Allow-Methods:POST,GET"); // 带 cookie 的跨域访问 header("Access-Control-Allow-Credentials: true"); // 响应头设置 header("Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token"); }
到此这篇关于Nginx跨域问题解析与解决的文章就介绍到这了,更多相关Nginx跨域内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!