首页 > 系统相关 >Nginx map 使用详解

Nginx map 使用详解

时间:2022-12-03 12:22:05浏览次数:66  
标签:map http 变量 Nginx 详解 匹配 com size

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,size
From: https://www.cnblogs.com/gaoyanbing/p/16947321.html

相关文章

  • 【SpringBoot】对于yaml的详细学习和三种属性赋值的实战详解
    一.yaml详细讲解1.1什么是yaml?YAML是一种数据序列化语言,通常用于编写配置文件。业界对YAML有不同的看法。有些人会说YAML代表另一种标记语言。其他人认为“YAML不是标记......
  • k8s篇-k8s集群架构及组件详解【史上最详细】
    Okubernetes简介k8s是什么k8s是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化。k8s能做什么1)服务发现和负载......
  • 记一次nginx配Https踏过的坑-单域名证书只能配置一个域名
    域名申请下来之后是可以访问了,但是如果需要用到小程序上面的话,还是需要支持https调用的。但是想着这还不难嘛。直接上ssl证书就好了。那么问题就来了,白嫖一时爽。。。。。。......
  • nginx反向代理websocket,ws转wss
    记录一下nginx规则location^~/echargenet-admin#本地代理目录{proxy_passhttp://127.0.0.1:8080/xxx;#websocket地址proxy_set_headerHost$host;#......
  • Day29:StringBuilder详解
    StringBuilder1.1StringBuilder概述我们先对普通的String字符串对象建立进行内存分析;publicclassDemo{publicstaticvoidmain(String[]args){Strin......
  • asp教程:ASP开发中存储过程应用详解
    ASP开发中存储过程应用详解|调用,参数,存储,数据库,输出,编译,mycomm,输入,userid,代码ASP与存储过程(StoredProcedures)的文章不少,但是我怀疑作者们是否真正实践过。......
  • Python+NumPy绘制常见曲线的方法详解_python
    一、利萨茹曲线二、计算斐波那契数列 三、方波方波可以近似表示为多个正弦波的叠加。任意一个方波信号都可以用无穷傅里叶级数来表示。需要累加很多项级数,且级数越......
  • __call__函数详解
    来自  https://blog.csdn.net/weixin_43702920/article/details/107832807   传送门__call__(self,) 该方法的功能类似于在类中重载() 运算符,使得类实例对......
  • 记一次cenos7安装nginx
    安装依赖yum-yinstallgccgcc-c++makelibtoolzlibzlib-developensslopenssl-develpcrepcre-devel 下载Nginx安装包wget-chttps://nginx.or......
  • Nginx系列---【如何隐藏响应头中nginx的版本信息?】
    隐藏响应头中nginx的版本信息1.问题描述在生产环境中,如果让别人知道你的nginx版本号,刚好这个版本的nginx有漏洞,就容易被人利用这个漏洞攻击你的服务。  2.解决方案......