0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

map指令简单介绍

马哥Linux运维 来源:博客园白--茶 2025-02-13 09:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

map指令简单介绍

当然这里写的都是官方文档是已经写过的,我简单抄一下哈。

map指令来自于ngx_http_map_module模块,提供的核心能力是 基于一个变量创建一个新变量,大概是这意思。

语法: 只能配置在http块内
map string $variable {...}

直接看这个语法好像看不出来它能干什么,所以官方文档上给了几个例子:

map $http_host $name {
    hostnames;

    default       0;

    example.com   1;
    *.example.com 1;
    example.org   2;
    *.example.org 2;
    .example.net  3;
    wap.*         4;
}

解析一下上面这个例子的意思:

map: 关键字,开辟一段内存空间声明一个map

$http_host: 获取host请求头:eg: www.baidu.com

$name: 新变量,具体取值是什么取决于结构体内的映射关系

结构体内的数据解析:
    hostnames:
    - 官方文档给出的解释是:允许用前缀或者后缀掩码指定域名作为源变量值。这个参数必须写在值映射列表的最前面。

    读都能读的懂,字也都认识,但是怎么感觉好像还是不太懂呢,又没有同感?于是我测试了一下,其实就是你想用下面那种泛域名来匹配host的话就加一下这个参数, 否则是达不到预期效果的。

    default 0; :匹配不到符合条件的数据时 则$name 这个变量就取默认值 0

知道了这之后我能用它来做什么呢?看实际应用的例子

map指令的实践使用

1. 基于cookie做多环境分流

一般中大型公司都会有多套测试环境,对于多环境的访问可能最容易想到的就是对应多个域名,这方法当然可以,但是不优雅,维护多个域名太累。为了偷懒,我们用了一个域名,使用不同的cookie来转发相应的流量到相应的环境。

如何实现?

    map $cookie_cl_env_num $cl_backend_map {
        default   1.1.1.1:80;
        dev-01    upstream_dev-01;
        dev-02    upstream_dev-02;
        dev-03    upstream_dev-03;
        test-01   upstream_test-01;
        test-02   upstream_test-02;
        test-03   upstream_test-03;
        test-04   upstream_test-04;
        test-05   upstream_test-05;
        test-06   upstream_test-06;
        test-07   upstream_test-07;
        test-08   upstream_test-08;
        test-09   upstream_test-09;
        test-10   upstream_test-10;
        test-11   upstream_test-11;
        test-12   upstream_test-12;
        test-13   upstream_test-13;
        test-14   upstream_test-14;
        test-15   upstream_test-15;
    }

    # 随便写一个
    upstream upstream_test-14 {
        server 2.2.2.2:80;
    }

    # 局部实现写一下
    location / {
        pass_pass http://$cl_backend_map;
    }

    # 请求
    curl --cookie "cl_env_num=test-15" a.test.com/api/v1/hahaha

这不就实现了嘛,很方便哈。仅提供思路!当然也可以使用其他变量来分流 UA|args ...

2. 做安全的多域名跨域访问

跨域访问一般情况下我们都会直接设置 * 允许所有跨域访问。但是难免会有一些对安全性要求较高的业务不允许这样,那么对于域名比较多的安全跨域配置,也可以使用map来实现。

map $http_origin $allow_origin {
    ~http://www.baidu.com http://www.baidu.com;
    ~http://m.baidu.com   http://m.baidu.com;
    ~http://a.baidu.com   http://a.baidu.com;
    default               deny;
}

server {
    listen 80;
    server_name www.baidu.com;

    location / {
        ...
        add_header Access-Control-Allow-Origin $allow_origin;
        ...
    }
}

仅提供思路哈,具体情况可以再优化

总结

当然还有很多场景都可以用到, 无法一一列举, 自己能够根据需求和场景灵活运用是最好的。

链接:https://www.cnblogs.com/chaizhenhua/p/16247460.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2822

    浏览量

    52797
  • 指令
    +关注

    关注

    1

    文章

    617

    浏览量

    37300

原文标题:Nginx的map指令还能这样用

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    简单介绍ARM的指令

    寄存器内容进行操作,而不是直接对内存内容。简单寻址模式,所有load/store地址由寄存器内容和指令确定。该体系结构定义了处理单元与内存(包括缓存)的交互,并包括内存地址翻译系统。它还描述了多个处理
    发表于 08-18 10:58

    MDK编译生成的MAP文件内容介绍

    MDK编译生成的MAP文件内容
    发表于 01-08 06:57

    介绍编译器生成的map和htm文件

    第10章 STM32H7的FLASH,RAM和栈使用情况(map和htm文件)本章为大家介绍编译器生成的map和htm文件进行解析,通过这两个文件可以让大家对工程代码的认识程度提升一个档次。目录第10章 STM32H7...
    发表于 08-03 07:52

    总线的简单介绍

    一、总线的简单介绍: 处理器无疑是计算机中最重要的部件,但并不是唯一的部件。一台计算机也需要随机访问存储器(RAM)来存放机器码指令以便让处理器执行。计算机还必须有一些方法使这些指令
    发表于 08-05 07:25

    介绍一些MOV与ADD指令简单例子

    因为嵌入式系统学习需要,开始学习汇编语言学习资料是B站的视频:汇编语言程序 P9目录一、一些简单指令例子二、一个练习一、一些简单指令例子下图是一些
    发表于 01-07 06:39

    基于MAP的嵌入式MP3播放器设计与实现

    基于MAP的嵌入式MP3播放器设计与实现:多媒体应用处理器简称MAP,是一种适用于便携式数字音视频设备的新型嵌入式应用处理器。文中介绍MAP 的主要性能特点,给出了基于
    发表于 08-02 14:50 38次下载

    Map Service Engine Based On We

    Abstract:A design and implementation of map service engine based on web is introduced
    发表于 07-23 10:43 17次下载

    MC8051_IP核简单指令的仿真步骤

    MC8051_IP核简单指令的仿真步骤。
    发表于 05-06 11:47 0次下载

    mapreduce 中MAP进程的数量怎么控制?

    1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值3.如果输入中有很多小文件,依然想减少
    发表于 01-02 14:04 2133次阅读
    mapreduce 中<b class='flag-5'>MAP</b>进程的数量怎么控制?

    mapreduce设置map个数_mapreduce设置map内存

    map阶段读取数据前,FileInputFormat会将输入文件分割成split,split的个数决定了map的个数。
    发表于 01-02 14:26 1.2w次阅读
    mapreduce设置<b class='flag-5'>map</b>个数_mapreduce设置<b class='flag-5'>map</b>内存

    Java Map的几种循环方式学习总结

    本文档内容介绍了基于Java Map的几种循环方式学习总结,供参考
    发表于 03-19 15:51 0次下载

    ESP8266和单片机最简单的AT指令的使用程序免费下载

    本文档的主要内容详细介绍的是ESP8266和单片机最简单的AT指令的使用程序免费下载。
    发表于 08-02 17:34 11次下载
    ESP8266和单片机最<b class='flag-5'>简单</b>的AT<b class='flag-5'>指令</b>的使用程序免费下载

    基于区块链技术的去中心化地理空间信息共识平台MAP介绍

    MAP接收用户对空间映射数据和基于位置的元数据的贡献并为其确定优先级。 EOS.IO软件为MAP提供诸如具有高鲁棒性的共识机制,快速的交易速度和高效的资源利用机制。
    发表于 08-29 14:34 2499次阅读

    什么是 map

    map 容器,又称键值对容器,即该容器的底层是以红黑树变体实现的,是典型的关联式容器。这意味着,map 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。跟任意其它类型容器一样,它能够存放各种类型的对象。
    的头像 发表于 02-27 15:41 4369次阅读

    ARM系列-WFI和WFE指令介绍

    今天来看两个特殊的指令,WFI(Wait For Interrupt)和WFE(Wait For Event)。这两条指令的语法非常简单,不需要带任何参数。
    发表于 05-29 17:47 5860次阅读