如何利用map实现Nginx允许多个域名跨域


Posted in Servers onMarch 31, 2021

常见的 Nginx 配置允许跨域

server {
  listen    11111;
  server_name localhost;

  location ~ /xxx/xx {
    if ($request_method = 'OPTIONS') {
      return 204;
    }
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
    proxy_pass http://1.2.3.4:5678;
  }
}

指定 Access-Control-Allow-Origin 为 ‘*' ,即为最简单暴力的允许所有访问跨域

允许 Cookie

有些场景下需要使用 Cookie,这时 Nginx 需要加一句 add_header Access-Control-Allow-Credentials 'true';,但此时会发现浏览器报错,说该参数为 true 时,allow origin 不能设置为 ‘*‘,如果手动指定了多个域名,那同样会被浏览器提示错误,说 allow origin 不能设置多个,这些是协议层面的限制

使用 map

在 Nginx 中可以使用 map 得到一个自定义变量,简单的使用可以参考官方文档,在上面提到的场景中,可以对请求中的 origin 做一个过滤处理,把符合要求的请求域名放到一个变量中,在设置 allow origin 时使用该变量就能实现一个动态的、多个的允许跨域域名

一个示例配置如下:

map $http_origin $allow_origin {
  default "";
  "~^(https?://localhost(:[0-9]+)?)" $1;
  "~^(https?://127.0.0.1(:[0-9]+)?)" $1;
  "~^(https?://172.10(.[\d]+){2}(:[0-9]+)?)" $1;
  "~^(https?://192.168(.[\d]+){2}(:[0-9]+)?)" $1;
}

server {
  listen    11111;
  server_name localhost;

  location ~ /xxx/xx {
    if ($request_method = 'OPTIONS') {
      return 204;
    }
    add_header Access-Control-Allow-Origin $allow_origin;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
    add_header Access-Control-Allow-Credentials 'true';
    proxy_pass http://1.2.3.4:5678;
  }
}

解释说明:

$http_origin 是 Nginx 的内部变量,用于获取请求头中的 origin

$allow_origin 是可以自定义的变量名

总结

到此这篇关于如何利用map实现Nginx允许多个域名跨域的文章就介绍到这了,更多相关map实现Nginx允许多个域名跨域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Filebeat 采集 Nginx 日志的方法
Mar 31 Servers
Nginx配置Https安全认证的实现
May 26 Servers
nginx安装以及配置的详细过程记录
Sep 15 Servers
Nginx 反向代理解决跨域问题多种情况分析
Jan 18 Servers
详解nginx安装过程并代理下载服务器文件
Feb 12 Servers
详解使用内网穿透工具Ngrok代理本地服务
Mar 31 Servers
使用Apache Camel表达REST服务的方法
Jun 10 Servers
永中文档在线转换预览基于nginx配置部署方案
Jun 10 Servers
vscode内网访问服务器的方法
Jun 28 Servers
如何让你的Nginx支持分布式追踪详解
Jul 07 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 Servers
Nginx 过滤静态资源文件的访问日志的实现
Mar 31 #Servers
Nginx的反向代理实例详解
nginx反向代理时如何保持长连接
Mar 31 #Servers
Nginx + consul + upsync 完成动态负载均衡的方法详解
Mar 31 #Servers
浅谈Nginx 中的两种限流方式
Mar 31 #Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 #Servers
nginx里的rewrite跳转的实现
Mar 31 #Servers
You might like
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
js图片预加载示例
2014/04/30 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Python中暂存上传图片的方法
2015/02/18 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
Python 私有化操作实例分析
2019/11/21 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
班主任工作经验材料
2014/02/02 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
动物科学专业求职信
2014/07/27 职场文书
放飞理想演讲稿
2014/09/09 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
花田少年史观后感
2015/06/16 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
python中opencv实现图片文本倾斜校正
2021/06/11 Python