Nginx的map指令還能這樣用

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
                                                              (版權歸原作者所有,侵刪)


相關文章