如何利用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 相关文章推荐
使用Apache的rewrite
Mar 09 Servers
nginx处理http请求实现过程解析
Mar 31 Servers
apache基于端口创建虚拟主机的示例
Apr 22 Servers
使用goaccess分析nginx日志的详细方法
Jul 09 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
nginx.conf配置文件结构小结
Apr 08 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
Windows Server 2012 R2 磁盘分区教程
Apr 29 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
git stash(储藏)的用法总结
Jun 25 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
搭建zabbix监控以及邮件报警的超级详细教学
Jul 15 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设计模式 php实现合成模式(composite)
2015/12/08 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
Python中变量交换的例子
2014/08/25 Python
Python实例一个类背后发生了什么
2016/02/09 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
Python中extend和append的区别讲解
2019/01/24 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
python实现取余操作的简单实例
2020/08/16 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
程序员机试试题汇总
2012/03/07 面试题
abstract class和interface有什么区别
2013/08/04 面试题
劳动工资科岗位职责范本
2014/03/02 职场文书
新闻发布会策划方案
2014/06/12 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
世界气象日活动总结
2015/02/27 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript