如何利用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性能的一些建议
Mar 31 Servers
Nginx四层负载均衡的配置指南
Jun 11 Servers
nginx安装以及配置的详细过程记录
Sep 15 Servers
了解Kubernetes中的Service和Endpoint
Apr 01 Servers
Docker下安装Oracle19c
Apr 13 Servers
阿里云ECS云服务器快照的概念以及如何使用
Apr 21 Servers
Nginx配置之禁止指定IP访问
May 02 Servers
在容器中使用nginx搭建上传下载服务器
May 11 Servers
Linux中各个目录的作用与内容
Jun 28 Servers
nginx代理实现静态资源访问的示例代码
Jul 07 Servers
Linux安装Docker详细教程
Jul 07 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获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
pyside写ui界面入门示例
2014/01/22 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
Python内置函数property()如何使用
2020/09/01 Python
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
shell程序中如何注释
2012/01/28 面试题
实习护理工作自我评价
2013/09/25 职场文书
大学生个人事迹材料
2014/01/21 职场文书
医务人员自我评价
2014/01/26 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
医院员工辞职信范文
2015/05/12 职场文书
雷锋电影观后感
2015/06/10 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
Java基于字符界面的简易收银台
2021/06/26 Java/Android
Python Django获取URL中的数据详解
2021/11/01 Python
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL