如何利用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 相关文章推荐
nginx作grpc的反向代理踩坑总结
Jul 07 Servers
关于nginx 实现jira反向代理的问题
Sep 25 Servers
Nginx进程调度问题详解
Sep 25 Servers
详解nginx安装过程并代理下载服务器文件
Feb 12 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
Nginx配置根据url参数重定向
Apr 11 Servers
nginx lua 操作 mysql
May 15 Servers
利用nginx搭建RTMP视频点播、直播、HLS服务器
May 25 Servers
CentOS7环境下MySQL8常用命令小结
Jun 10 Servers
Linux中sftp常用命令整理
Jun 28 Servers
nginx访问报403错误的几种情况详解
Jul 23 Servers
Nginx跨域问题解析与解决
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
PHP调用三种数据库的方法(3)
2006/10/09 PHP
php下实现农历日历的代码
2007/03/07 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
ansible作为python模块库使用的方法实例
2017/01/17 Python
python实现按长宽比缩放图片
2018/06/07 Python
python自动发微信监控报警
2019/09/06 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
简单叙述一下MYSQL的优化
2016/05/09 面试题
大学生个人总结的自我评价
2013/10/05 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
父亲节寄语大全
2015/02/27 职场文书
自荐信怎么写
2015/03/04 职场文书
综合素质自我评价评语
2015/03/06 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书