首页 > 系统相关 >nginx map 使用详解--转

nginx map 使用详解--转

时间:2022-11-01 15:35:34浏览次数:41  
标签:map http 变量 -- nginx 匹配 com

map 指令介绍:
map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。
map 的主要作用是创建自定义变量,通过使用 nginx 的内置变量,去匹配某些特定规则,如果匹配成功则设置某个值给自定义变量。 而这个自定义变量又可以作于他用。
直接看个例子理解起来比较清晰:
•场景: 匹配请求 url 的参数,如果参数是 debug 则设置 $foo = 1 ,默认设置 $foo = 0
map $args $foo {
    default 0;
    debug  1;
}

解释:
$args 是nginx内置变量,就是获取的请求 url 的参数。 如果 $args 匹配到 debug 那么 $foo 的值会被设为 1 ,如果 $args 一个都匹配不到 $foo 就是default 定义的值,在这里就是 0
map 语法
map $var1 $var2 {...}
map 指令的三个参数:
1、default : 指定源变量匹配不到任何表达式时将使用的默认值。当没有设置 default,将会用一个空的字符串作为默认的结果。
2、hostnames : 允许用前缀或者后缀掩码指定域名作为源变量值。这个参数必须写在值映射列表的最前面。
3、include : 包含一个或多个含有映射值的文件。
•在 Nginx 配置文件中的作用段: http{} ,注意 map 不能写在 server{} 否则会报错
map 的 $var1 为源变量,通常可以是 nginx 的内置变量,$var2 是自定义变量。 $var2 的值取决于 $var1 在对应表达式的匹配情况。 如果一个都匹配不到则 $var2 就是 default 对应的值。
•一个正则表达式如果以 “~” 开头,表示这个正则表达式对大小写敏感。以 “~*”开头,表示这个正则表达式对大小写不敏感。
map $http_user_agent $agent {
    default "";
    ~curl curl;
    ~*apachebench" ab;
}   
•正则表达式里可以包含命名捕获和位置捕获,这些变量可以跟结果变量一起被其它指令使用。
map $uri $value {
    /abc                      /index.php;
    ~^/teacher/(?<suffix>.*)$  /boy/;
    ~/fz(/.*)                  /index.php?fz=1;                         
}
==注意:不能在map块里面引用命名捕获或位置捕获变量。如~^/qupeicom/(.*) /peiyin/$1; 这样会报错nginx: [emerg] unknown variable==
==注意二:如果源变量值包含特殊字符如‘~’,则要以‘\’来转义。==
map $http_referer $value {
    Mozilla    111;
    \~Mozilla  222;
}
•源变量匹配表达式对应的结果值可以是一个字符串也可以是另外一个变量。
map $http_referer $value {
    Mozilla    'chrom';
    \~safity    $http_user_agent;

实例(一)
•使用 map 来实现允许多个域名跨域访问的问题

如果是允许单域名跨域访问直接配置就行了,如下:

# 这些配置可以写在 http{} 或者 server{} 都是支持的。
add_header Access-Control-Allow-Origin "http://www.linuxidc.com";
add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
add_header Access-Control-Max-Age "3600";
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept;

#!/bin/bash
# 上面的配置只允许 http://www.linuxidc.com 跨域访问,如果要支持所有域名都可以跨域调用该站。  把上面一行改成这样,不过不推荐这样做,因为不安全
add_header Access-Control-Allow-Origin "*";

如果不想允许所有,但是又需要允许多个域名,那么就需要用到 map

map $http_origin $corsHost {
    default 0;
    "~http://www.linuxmi.com" http://www.linuxmi.com;
    "~http://m.linuxmi.com" http://m.linuxmi.com;
    "~http://wap.linuxmi.com" http://wap.linuxmi.com;
}
server
{
    listen 80;
    server_name www.linuxmi.com;
    root /nginx;
    location /
    {
        add_header Access-Control-Allow-Origin $corsHost;
    }
}

实例(二)

•使用源变量(通常是 nginx 内置变量)匹配一些规则,创建自定义变量,然后在页面输出. 这通常在调试的时候非常有用

http {
map $uri $match {
    ~^/hello/(.*) http://www.hello.com/;
}
server {
    listen      8080;
    server_name  test.hello.com;

    location /hello {
            default_type text/plain;
            echo uri: $uri;
            echo match: $match;
            echo capture: $1;
            echo new: $match$1;
    }

map 涉及的性能问题

大家可能会有一个问题,map 既然只能用在 http 段,这是全局的啊。 这个设置会让访问所有虚拟主机的请求都要匹配并设置一遍变量的值,然而事实并非如此,对于没有用到相关变量的请求来说,并不会执行 map 操作。 就没有性能上的损失。

匹配优先级问题

如果匹配到多个特定的变量,如掩码和正则同时匹配,那么会按照下面的顺序进行选择:
1.没有掩码的字符串
2.最长的带前缀的字符串,例如: “*.example.com”
3.最长的带后缀的字符串,例如:“mail.*”
4.按顺序第一个先匹配的正则表达式 (在配置文件中体现的顺序)
5.默认值

map_hash_bucket_size

•语法: map_hash_bucket_size size;
•默认值: map_hash_bucket_size 32|64|128;
•配置段: http

•指定一个映射表中的变量在哈希表中的最大值,这个值取决于处理器的缓存。

•map_hash_max_size
•语法: map_hash_max_size size;
•默认值: map_hash_max_size 2048;
•配置段: http
•设置映射表对应的哈希表的最大值。

标签:map,http,变量,--,nginx,匹配,com
From: https://www.cnblogs.com/hsjz-xinyuan/p/16847860.html

相关文章

  • Docker不香吗?为什么还要用k8s
    其实Docker和k8s并非直接的竞争对手,它俩相互依存。Docker是一个容器化平台,而k8s是Docker等容器平台的协调器。虚拟化技术已经走过了三个时代,没有容器化技术的演......
  • AXI4_Lite
    写在前面        AXI4-Lite总线可以说是AXI4-Full总线的简化版,仅支持突发长度为1的事务传输。在学习AXI4-Lite总线时,建议先了解AXI4-Full总线,本文也注重介绍两者......
  • 使用Docker部署软件运行环境
    什么是docker?Docker是基于Go语言进行开发实现,一个开源的应用容器引擎。采用Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,也可以实现虚拟化,隔离......
  • 关于代理的设置
    环境变量设置代理全局设置代理就使用环境变量配置(这里只针对Linux或者Mac)vim/etc/profile--------------------------------------------http_proxy=IP:PORThttps_pr......
  • 基于单片机的篮球计分器系统设计(#0456)
    功能描述1、采用51/52单片机作为主控芯片;2、采用1个四位数码管显示比赛时间、2个三位数码管显示两方比分、1个两位数码管显示24秒倒计时;3、可通过按键控制比赛开始/暂停、修......
  • 122. 买卖股票的最佳时机II
    给你一个整数数组prices,其中 prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有一股股票。你也可以先......
  • 基于单片机的篮球计分器系统设计(#0455)
    功能描述1、采用51/52单片机作为主控芯片;2、采用LCD1602显示双方比分、节数、12分/24秒倒计时;3、采用按键控制比赛开始/暂停、24秒计时、加分操作;4、采用蜂鸣器产生以下提示......
  • go mongo 时区问题
       https://zhuanlan.zhihu.com/p/479189070   funcmain(){sh,err:=time.LoadLocation("Asia/Shanghai")//设置时区iferr!=nil{......
  • git tag
    主要看如何打tag(从最新commit和历史某个commit),然后一般都使用-a的taghttps://www.runoob.com/git/git-tag.htmlhttps://git-scm.com/book/zh/v2/Git-基础-打标签关于......
  • 基于单片机的智能洗手器系统设计(#0460)
    功能描述本设计由STC89C52单片机电路+2路水泵控制电路+红外避障传感器电路+继电器控制电路+DS18B20温度检测电路+按键电路+电源电路组成。1、当红外避障传感器检测到障碍后......