如何利用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
如何在centos上使用yum安装rabbitmq-server
Mar 31 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
apache基于端口创建虚拟主机的示例
Apr 24 Servers
解析在浏览器地址栏输入一个URL后发生了什么
Jun 21 Servers
nginx实现动静分离的方法示例
Nov 07 Servers
鲲鹏 CentOS 7 安装Python3.7
May 11 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
Windows Server 修改远程桌面端口的实现
Jun 25 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
Nginx报404错误的详细解决方法
Jul 23 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 - Html Transfer Code
2006/10/09 PHP
Content-type 的说明
2006/10/09 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
js防止表单重复提交实现代码
2012/09/05 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python使用pymysql小技巧
2017/06/04 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
简约控的天堂:The Undone
2016/12/21 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
2014年教师节活动总结
2014/08/29 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
起诉意见书范文
2015/05/19 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
微信小程序实现聊天室功能
2021/06/14 Javascript
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers