如何利用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 相关文章推荐
Linux中Nginx的防盗链和优化的实现代码
Jun 20 Servers
使用goaccess分析nginx日志的详细方法
Jul 09 Servers
详解Nginx 被动检查服务器的存活状态
Oct 16 Servers
Apache Pulsar集群搭建部署详细过程
Feb 12 Servers
Kubernetes关键组件与结构组成介绍
Mar 31 Servers
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
Apr 07 Servers
nginx 配置缓存
May 11 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
腾讯云服务器部署前后分离项目之前端部署
Jun 28 Servers
nginx代理实现静态资源访问的示例代码
Jul 07 Servers
教你nginx跳转配置的四种方式
Jul 07 Servers
nginx七层负载均衡配置详解
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
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
js资料toString 方法
2007/03/13 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
深入理解Python中的元类(metaclass)
2015/02/14 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python count函数使用方法实例解析
2020/03/23 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
会计自我鉴定范文
2013/10/06 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
论文致谢词范文
2015/05/14 职场文书
公司员工手册范本
2015/05/14 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android