- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會(huì )理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標記
- 域名注冊服務(wù)機構許可:滇D3-20230001
- 代理域名注冊服務(wù)機構:新網(wǎng)數碼
map 指令介紹:
map 指令是由 ngx_http_map_module 模塊提供的,默認情況下安裝 nginx 都會(huì )安裝該模塊。
map 的主要作用是創(chuàng )建自定義變量,通過(guò)使用 nginx 的內置變量,去匹配某些特定規則,如果匹配成功則設置某個(gè)值給自定義變量。 而這個(gè)自定義變量又可以作于他用。
直接看個(gè)例子理解起來(lái)比較清晰:
?場(chǎng)景: 匹配請求 url 的參數,如果參數是 debug 則設置 $foo = 1 ,默認設置 $foo = 0
map $args $foo { default 0; debug 1; }
解釋?zhuān)?/p>
$args 是nginx內置變量,就是獲取的請求 url 的參數。 如果 $args 匹配到 debug 那么 $foo 的值會(huì )被設為 1 ,如果 $args 一個(gè)都匹配不到 $foo 就是default 定義的值,在這里就是 0
map 語(yǔ)法
map $var1 $var2 {...}
map 指令的三個(gè)參數:
1、default : 指定源變量匹配不到任何表達式時(shí)將使用的默認值。當沒(méi)有設置 default,將會(huì )用一個(gè)空的字符串作為默認的結果。
2、hostnames : 允許用前綴或者后綴掩碼指定域名作為源變量值。這個(gè)參數必須寫(xiě)在值映射列表的最前面。
3、include : 包含一個(gè)或多個(gè)含有映射值的文件。
?在 Nginx 配置文件中的作用段: http{} ,注意 map 不能寫(xiě)在 server{} 否則會(huì )報錯
map 的 $var1 為源變量,通??梢允?nginx 的內置變量,$var2 是自定義變量。 $var2 的值取決于 $var1 在對應表達式的匹配情況。 如果一個(gè)都匹配不到則 $var2 就是 default 對應的值。
?一個(gè)正則表達式如果以 “~” 開(kāi)頭,表示這個(gè)正則表達式對大小寫(xiě)敏感。以 “~*”開(kāi)頭,表示這個(gè)正則表達式對大小寫(xiě)不敏感。
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; 這樣會(huì )報錯nginx: [emerg] unknown variable==
==注意二:如果源變量值包含特殊字符如‘~’,則要以‘\’來(lái)轉義。==
map $http_referer $value { Mozilla 111; \~Mozilla 222; }
?源變量匹配表達式對應的結果值可以是一個(gè)字符串也可以是另外一個(gè)變量。
map $http_referer $value { Mozilla 'chrom'; \~safity $http_user_agent;
實(shí)例(一)
?使用 map 來(lái)實(shí)現允許多個(gè)域名跨域訪(fǎng)問(wèn)的問(wèn)題
如果是允許單域名跨域訪(fǎng)問(wèn)直接配置就行了,如下:
# 這些配置可以寫(xiě)在 http{} 或者 server{} 都是支持的。
add_header Access-Control-Allow-Origin "http://www.tjdsmy.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://www.tjdsmy.cn 跨域訪(fǎng)問(wèn),如果要支持所有域名都可以跨域調用該站。 把上面一行改成這樣,不過(guò)不推薦這樣做,因為不安全
add_header Access-Control-Allow-Origin "*";
如果不想允許所有,但是又需要允許多個(gè)域名,那么就需要用到 map
map $http_origin $corsHost { default 0; "~http://www.tjdsmy.cn" http://www.tjdsmy.cn; "~http://www.tjdsmy.cn" http://www.tjdsmy.cn; "~http://www.tjdsmy.cn" http://www.tjdsmy.cn; } server { listen 80; server_name www.tjdsmy.cn; root /nginx; location / { add_header Access-Control-Allow-Origin $corsHost; } }
實(shí)例(二)
?使用源變量(通常是 nginx 內置變量)匹配一些規則,創(chuàng )建自定義變量,然后在頁(yè)面輸出. 這通常在調試的時(shí)候非常有用
http { map $uri $match { ~^/hello/(.*) http://www.tjdsmy.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 涉及的性能問(wèn)題
大家可能會(huì )有一個(gè)問(wèn)題,map 既然只能用在 http 段,這是全局的啊。 這個(gè)設置會(huì )讓訪(fǎng)問(wèn)所有虛擬主機的請求都要匹配并設置一遍變量的值,然而事實(shí)并非如此,對于沒(méi)有用到相關(guān)變量的請求來(lái)說(shuō),并不會(huì )執行 map 操作。 就沒(méi)有性能上的損失。
匹配優(yōu)先級問(wèn)題
如果匹配到多個(gè)特定的變量,如掩碼和正則同時(shí)匹配,那么會(huì )按照下面的順序進(jìn)行選擇:
1.沒(méi)有掩碼的字符串
2.最長(cháng)的帶前綴的字符串,例如: “*.example.com”
3.最長(cháng)的帶后綴的字符串,例如:“mail.*”
4.按順序第一個(gè)先匹配的正則表達式 (在配置文件中體現的順序)
5.默認值
map_hash_bucket_size
?語(yǔ)法: map_hash_bucket_size size;
?默認值: map_hash_bucket_size 32|64|128;
?配置段: http
?指定一個(gè)映射表中的變量在哈希表中的最大值,這個(gè)值取決于處理器的緩存。
?map_hash_max_size
?語(yǔ)法: map_hash_max_size size;
?默認值: map_hash_max_size 2048;
?配置段: http
?設置映射表對應的哈希表的最大值。
售前咨詢(xún)
售后咨詢(xún)
備案咨詢(xún)
二維碼
TOP