日本三级片在线观看视频_西西大胆午夜人体视频无码_少妇无码一区二区_亚洲天堂超碰_极品少妇被猛的白浆直流_91精品云霸高清中文字幕_草草五月天伊人_久久少妇无码专区_欧美激欧美啪啪5老太_日韩在线在线成人

Nginx map 使用詳解

2019-01-08 06:35:24 12472

map 指令介紹:


map 指令是由 ngx_http_map_module 模塊提供的,默認(rèn)情況下安裝 nginx 都會(huì)安裝該模塊。


map 的主要作用是創(chuàng)建自定義變量,通過使用 nginx 的內(nèi)置變量,去匹配某些特定規(guī)則,如果匹配成功則設(shè)置某個(gè)值給自定義變量。 而這個(gè)自定義變量又可以作于他用。


直接看個(gè)例子理解起來比較清晰:


?場景: 匹配請求 url 的參數(shù),如果參數(shù)是 debug 則設(shè)置 $foo = 1 ,默認(rèn)設(shè)置 $foo = 0


map $args $foo {
    default 0;
    debug  1;
}

解釋:


$args 是nginx內(nèi)置變量,就是獲取的請求 url 的參數(shù)。 如果 $args 匹配到 debug 那么 $foo 的值會(huì)被設(shè)為 1 ,如果 $args 一個(gè)都匹配不到 $foo 就是default 定義的值,在這里就是 0


map 語法

map $var1 $var2 {...}

map 指令的三個(gè)參數(shù):


1、default : 指定源變量匹配不到任何表達(dá)式時(shí)將使用的默認(rèn)值。當(dāng)沒有設(shè)置 default,將會(huì)用一個(gè)空的字符串作為默認(rèn)的結(jié)果。


2、hostnames : 允許用前綴或者后綴掩碼指定域名作為源變量值。這個(gè)參數(shù)必須寫在值映射列表的最前面。


3、include : 包含一個(gè)或多個(gè)含有映射值的文件。


?在 Nginx 配置文件中的作用段: http{} ,注意 map 不能寫在 server{} 否則會(huì)報(bào)錯(cuò)


map 的 $var1 為源變量,通??梢允?nginx 的內(nèi)置變量,$var2 是自定義變量。 $var2 的值取決于 $var1 在對應(yīng)表達(dá)式的匹配情況。 如果一個(gè)都匹配不到則 $var2 就是 default 對應(yīng)的值。


?一個(gè)正則表達(dá)式如果以 “~” 開頭,表示這個(gè)正則表達(dá)式對大小寫敏感。以 “~*”開頭,表示這個(gè)正則表達(dá)式對大小寫不敏感。


map $http_user_agent $agent {
    default "";
    ~curl curl;
    ~*apachebench" ab;
}

  

?正則表達(dá)式里可以包含命名捕獲和位置捕獲,這些變量可以跟結(jié)果變量一起被其它指令使用。


map $uri $value {
    /abc                      /index.php;
    ~^/teacher/(?<suffix>.*)$  /boy/;
    ~/fz(/.*)                  /index.php?fz=1;                          
}

==注意:不能在map塊里面引用命名捕獲或位置捕獲變量。如~^/qupeicom/(.*) /peiyin/$1; 這樣會(huì)報(bào)錯(cuò)nginx: [emerg] unknown variable==


==注意二:如果源變量值包含特殊字符如‘~’,則要以‘\’來轉(zhuǎn)義。==


map $http_referer $value {
    Mozilla    111;
    \~Mozilla  222;
}

?源變量匹配表達(dá)式對應(yīng)的結(jié)果值可以是一個(gè)字符串也可以是另外一個(gè)變量。


map $http_referer $value {
    Mozilla    'chrom';
    \~safity    $http_user_agent;

實(shí)例(一)


?使用 map 來實(shí)現(xiàn)允許多個(gè)域名跨域訪問的問題


如果是允許單域名跨域訪問直接配置就行了,如下:


# 這些配置可以寫在 http{} 或者 server{} 都是支持的。


add_header Access-Control-Allow-Origin "http://m.lncdfzh.com.cn";
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://m.lncdfzh.com.cn 跨域訪問,如果要支持所有域名都可以跨域調(diào)用該站。  把上面一行改成這樣,不過不推薦這樣做,因?yàn)椴话踩?/p>

add_header Access-Control-Allow-Origin "*";


如果不想允許所有,但是又需要允許多個(gè)域名,那么就需要用到 map


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

實(shí)例(二)


?使用源變量(通常是 nginx 內(nèi)置變量)匹配一些規(guī)則,創(chuàng)建自定義變量,然后在頁面輸出. 這通常在調(diào)試的時(shí)候非常有用


http {
map $uri $match {
    ~^/hello/(.*) http://m.lncdfzh.com.cn/;
}
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 涉及的性能問題


大家可能會(huì)有一個(gè)問題,map 既然只能用在 http 段,這是全局的啊。 這個(gè)設(shè)置會(huì)讓訪問所有虛擬主機(jī)的請求都要匹配并設(shè)置一遍變量的值,然而事實(shí)并非如此,對于沒有用到相關(guān)變量的請求來說,并不會(huì)執(zhí)行 map 操作。 就沒有性能上的損失。


匹配優(yōu)先級問題


如果匹配到多個(gè)特定的變量,如掩碼和正則同時(shí)匹配,那么會(huì)按照下面的順序進(jìn)行選擇:


1.沒有掩碼的字符串


2.最長的帶前綴的字符串,例如: “*.example.com”


3.最長的帶后綴的字符串,例如:“mail.*”


4.按順序第一個(gè)先匹配的正則表達(dá)式 (在配置文件中體現(xiàn)的順序)


5.默認(rèn)值

map_hash_bucket_size


?語法: map_hash_bucket_size size;


?默認(rèn)值: map_hash_bucket_size 32|64|128;


?配置段: http


?指定一個(gè)映射表中的變量在哈希表中的最大值,這個(gè)值取決于處理器的緩存。


?map_hash_max_size


?語法: map_hash_max_size size;


?默認(rèn)值: map_hash_max_size 2048;


?配置段: http


?設(shè)置映射表對應(yīng)的哈希表的最大值。


提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問題: