如何利用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实现限制某IP短时间访问次数
Mar 31 Servers
Nginx工作原理和优化总结。
Apr 02 Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 Servers
Nginx配置根据url参数重定向
Apr 11 Servers
服务器间如何实现文件共享
May 20 Servers
docker 制作mysql镜像并自动安装
May 20 Servers
Win Server2016远程桌面如何允许多用户同时登录
Jun 10 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
Win2008系统搭建DHCP服务器
Jun 25 Servers
设置IIS Express并发数
Jul 07 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 set_error_handler()函数使用详解(示例)
2013/11/12 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
微信支付开发告警通知实例
2016/07/12 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
python连接MySQL数据库实例分析
2015/05/12 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
详解Python if-elif-else知识点
2018/06/11 Python
python实现顺序表的简单代码
2018/09/28 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Python如何绘制日历图和热力图
2020/08/07 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
酒店公关部经理岗位职责
2013/11/24 职场文书
项目总经理岗位职责
2014/02/14 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
安全教育主题班会总结
2015/08/14 职场文书
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL