🎈 专注app软件定制开发什么是跨域
- 域: 专注app软件定制开发是指浏览器不能执行其专注app软件定制开发他网站的脚本
- 跨域: 它是由浏览器的 同源策略 造成的,是浏览器对
JavaScript
实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol
,主机 host
和端口号 port
则就会造成 跨域
🎈 跨域场景
当前url | 请求url | 是否跨域 | 原因 |
---|
http://www.autofelix.cn | http://www.autofelix.cn/api.php | 否 | 协议/域名/端口都相同 |
http://www.autofelix.cn | https://www.autofelix.cn/api.php | 是 | 协议不同 |
http://www.autofelix.cn | http://www.rabbit.cn | 是 | 主域名不同 |
http://www.autofelix.cn | http://api.autofelix.cn | 是 | 子域名不同 |
http://www.autofelix.cn:80 | http://www.autofelix.cn:8080 | 是 | 端口不同 |
🎈 解决跨域的四种方式
- nginx的反向代理
- 使用
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; index index.html index.htm; add_header Access-Control-Allow-Origin http://www.domain1.com; add_header Access-Control-Allow-Credentials true; }}
- jsonp请求
jsonp
是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好 兼容低版本IE
,缺点是只支持 get
请求,不支持 post
请求- 原理时网页通过添加一个
<script>
元素,向服务器请求 json
数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来
<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
文件返回数据
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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 后端语言的设置
- 主要通过后端语言主动设置跨域请求,这里以
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)) { header('Access-Control-Allow-Origin:' . $origin); header('Access-Control-Allow-Methods:POST,GET'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token');}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23