map指令簡單介紹
當然這裡寫的都是官方文件是已經寫過的,我簡單抄一下哈。
map指令來自於 ngx_http_map_module 模組,提供的核心能力是 基於一個變數建立一個新變數,大概是這意思。
語法: 只能配置在http塊內
mapstring
$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 {
listen80
;
server_name www.baidu.com;
location / {
...
add_header Access-Control-Allow-Origin $allow_origin;
...
}
}
僅提供思路哈,具體情況可以再最佳化
總結
當然還有很多場景都可以用到, 無法一一列舉, 自己能夠根據需求和場景靈活運用是最好的。
連結:https://www.cnblogs.com/chaizhenhua/p/16247460.html
(版權歸原作者所有,侵刪)