如何利用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优化的六点方法
Mar 31 Servers
nginx实现发布静态资源的方法
Mar 31 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
总结高并发下Nginx性能如何优化
Nov 01 Servers
Tomcat项目启动失败的原因和解决办法
Apr 20 Servers
KVM基础命令详解
Apr 30 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
Jul 07 Servers
Nginx代理Redis哨兵主从配置的实现
Jul 15 Servers
SpringBoot前端后端分离之Nginx服务器下载安装过程
Aug 14 Servers
keepalived + nginx 实现高可用方案
Dec 24 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入门小知识
2008/03/24 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
六个窍门助你提高Python运行效率
2015/06/09 Python
python如何读写csv数据
2018/03/21 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
Django 路由控制的实现
2019/07/17 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
python实现xml转json文件的示例代码
2020/12/30 Python
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
车间操作工岗位职责
2013/12/19 职场文书
学校安全工作制度
2014/01/19 职场文书
写给老婆的检讨书
2014/02/21 职场文书
初中差生评语
2014/12/29 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python