如何利用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+SpringBoot实现负载均衡的示例
Mar 31 Servers
如何在centos上使用yum安装rabbitmq-server
Mar 31 Servers
Nginx配置之实现多台服务器负载均衡
Aug 02 Servers
nginx常用配置conf的示例代码详解
Mar 21 Servers
Apache Hudi的多版本清理服务彻底讲解
Mar 31 Servers
docker-compose部署Yapi的方法
Apr 08 Servers
超越Nginx的Web服务器caddy优雅用法
Jun 21 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
nginx代理实现静态资源访问的示例代码
Jul 07 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
Jul 07 Servers
Windows7下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
GD输出汉字的函数的分析
2006/10/09 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
JS实现图片切换效果
2018/11/17 Javascript
python解析json实例方法
2013/11/19 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
python实现简单五子棋游戏
2019/06/18 Python
python+pygame实现坦克大战
2019/09/10 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
应届生保险求职信
2013/11/11 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
初一新生军训方案
2014/05/22 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript