map 指令是由 ngx_http_map_module 模塊提供的,默認狀況下安裝 nginx 都會安裝該模塊。 php
map 的主要做用是建立自定義變量,經過使用 nginx 的內置變量,去匹配某些特定規則,若是匹配成功則設置某個值給自定義變量。 而這個自定義變量又能夠做於他用。nginx
map $args $foo { default 0; debug 1; }
$args 是nginx內置變量,就是獲取的請求 url 的參數。 若是 $args 匹配到 debug 那麼 $foo 的值會被設爲 1 ,若是 $args 一個都匹配不到 $foo 就是default 定義的值,在這裏就是 0 正則表達式
map $var1 $var2 {...}
一、default : 指定源變量匹配不到任何表達式時將使用的默認值。當沒有設置 default,將會用一個空的字符串做爲默認的結果。apache
二、hostnames : 容許用前綴或者後綴掩碼指定域名做爲源變量值。這個參數必須寫在值映射列表的最前面。跨域
三、include : 包含一個或多個含有映射值的文件。緩存
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==bash
==注意二:若是源變量值包含特殊字符如‘~’,則要以‘\’來轉義。==cors
map $http_referer $value { Mozilla 111; \~Mozilla 222; }
map $http_referer $value { Mozilla 'chrom'; \~safity $http_user_agent;
# 這些配置能夠寫在 http{} 或者 server{} 都是支持的。 add_header Access-Control-Allow-Origin "http://www.tutu.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.tutu.com 跨域訪問,若是要支持全部域名均可以跨域調用該站。 把上面一行改爲這樣,不過不推薦這樣作,由於不安全 add_header Access-Control-Allow-Origin "*";
map $http_origin $corsHost { default 0; "~http://www.haibakeji.com" http://www.haibakeji.com; "~http://m.haibakeji.com" http://m.haibakeji.com; "~http://wap.haibakeji.com" http://wap.haibakeji.com; } server { listen 80; server_name www.haibakeji.com; root /nginx; location / { add_header Access-Control-Allow-Origin $corsHost; } }
使用源變量(一般是 nginx 內置變量)匹配一些規則,建立自定義變量,而後在頁面輸出. 這一般在調試的時候很是有用curl
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 既然只能用在 http 段,這是全局的啊。 這個設置會讓訪問全部虛擬主機的請求都要匹配並設置一遍變量的值,然而事實並不是如此,對於沒有用到相關變量的請求來講,並不會執行 map 操做。 就沒有性能上的損失。
若是匹配到多個特定的變量,如掩碼和正則同時匹配,那麼會按照下面的順序進行選擇:
- 沒有掩碼的字符串
- 最長的帶前綴的字符串,例如: 「*.example.com」
- 最長的帶後綴的字符串,例如:「mail.*」
- 按順序第一個先匹配的正則表達式 (在配置文件中體現的順序)
- 默認值
- 語法: 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
- 設置映射表對應的哈希表的最大值。