Nginx跨域问题解析与解决


Posted in Servers onAugust 05, 2022

什么是跨域

  • 域: 是指浏览器不能执行其他网站的脚本
  • 跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 跨域

Nginx跨域问题解析与解决

跨域场景

场景的跨域场景有哪些,请参考下表

当前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; #修改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跨域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
Jun 21 Servers
Nginx搭建rtmp直播服务器实现代码
Mar 31 Servers
Nginx + consul + upsync 完成动态负载均衡的方法详解
Mar 31 Servers
Nginx使用Lua模块实现WAF的原理解析
Sep 04 Servers
Dashboard管理Kubernetes集群与API访问配置
Apr 01 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
解决IIS7下无法绑定https主机的问题
Apr 29 Servers
基于docker安装zabbix的详细教程
Jun 05 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
Windows server 2012 NTP时间同步的实现
Jun 25 Servers
keepalived + nginx 实现高可用方案
Dec 24 Servers
win10搭建配置ftp服务器的方法
Aug 05 #Servers
windows系统搭建WEB服务器详细教程
Aug 05 #Servers
Win10系统搭建ftp文件服务器详细教程
Aug 05 #Servers
Linux在两个服务器直接传文件的操作方法
Aug 05 #Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 #Servers
阿里云服务器(windows)手动部署FTP站点详细教程
Aug 05 #Servers
WIN10使用IIS部署ftp服务器详细教程
Aug 05 #Servers
You might like
探讨方法的重写(覆载)详解
2013/06/08 PHP
php常见的魔术方法详解
2014/12/25 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
js资料prototype 属性
2007/03/13 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
js创建数组的简单方法
2016/07/27 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
点球小游戏python脚本
2018/05/22 Python
python 内置模块详解
2019/01/01 Python
python自动化之Ansible的安装教程
2019/06/13 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
python cookie反爬处理的实现
2020/11/01 Python
普通话宣传标语
2014/06/26 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
如何写辞职信
2015/05/13 职场文书
男人帮观后感
2015/06/18 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
工作报告范文
2019/06/20 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
mysql幻读详解实例以及解决办法
2022/06/16 MySQL