如何利用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 相关文章推荐
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
Mar 09 Servers
nginx搭建图片服务器的过程详解(root和alias的区别)
Mar 31 Servers
nginx 防盗链防爬虫配置详解
Mar 31 Servers
如何在centos上使用yum安装rabbitmq-server
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
nginx负载功能+nfs服务器功能解析
Feb 28 Servers
Apache Hudi数据布局黑科技降低一半查询时间
Mar 31 Servers
HDFS免重启挂载新磁盘
Apr 06 Servers
Windows Server 2012 R2 磁盘分区教程
Apr 29 Servers
使用Nginx+Tomcat实现负载均衡的全过程
May 30 Servers
Linux磁盘管理方法介绍
Jun 01 Servers
Win10系统搭建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
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php 无法载入mysql扩展
2010/03/12 PHP
php的debug相关函数用法示例
2016/07/11 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
如何实现iframe父子传参通信
2020/02/05 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
Python读大数据txt
2016/03/28 Python
python executemany的使用及注意事项
2017/03/13 Python
Python Flask基础教程示例代码
2018/02/07 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
共筑中国梦演讲稿
2014/04/23 职场文书
调研汇报材料范文
2014/08/17 职场文书
四查四看整改措施
2014/09/19 职场文书
2014年业务工作总结
2014/11/17 职场文书
内勤岗位职责
2015/02/10 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
python实现A*寻路算法
2021/06/13 Python
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫