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 相关文章推荐
nginx作grpc的反向代理踩坑总结
Jul 07 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
Windows下用Nginx配置https服务器及反向代理的问题
Sep 25 Servers
zabbix自定义监控nginx状态实现过程
Nov 01 Servers
为Centos安装指定版本的Docker
Apr 01 Servers
openstack云计算keystone组件工作介绍
Apr 20 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
解决Git推送错误non-fast-forward的方法
Jun 25 Servers
Windows Server 2008配置防火墙策略详解
Jun 28 Servers
在windows server 2012 r2中安装mysql的详细步骤
Jul 23 Servers
Windows server 2016服务器基本设置
Aug 14 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
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Python装饰器简单用法实例小结
2018/12/03 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
python读取Kafka实例
2019/12/23 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
办护照工作证明范本
2014/01/14 职场文书
综艺节目策划方案
2014/06/13 职场文书