map指令用法解释
map指令来自于 ngx_http_map_module 模块,提供的核心能力是 基于一个变量创建一个新变量
语法: 只能配置在http块内
map string $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指令的实践使用
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 { listen 80; server_name www.baidu.com; location / { ... add_header Access-Control-Allow-Origin $allow_origin; ... } }