在 nginx 中,`map` 指令用于将请求变量映射为新的值,而 `rewrite` 指令则根据这些映射结果执行 url 重写。结合使用时,通常先在 `http` 块中定义 `map` 规则,然后在 `server` 或 `location` 块中使用 `rewrite` 指令引用映射后的变量,从而实现基于复杂条件(如 http 头、uri 模式)的动态跳转。

如何根据 User-Agent 进行设备适配重写
当需要根据客户端的 User-Agent 区分移动端和桌面端并重写路径时,可以在 http 上下文中使用 map 指令匹配 $http_user_agent 变量。通过正则表达式识别包含 Mobile 等关键字的请求,将其映射为特定标识,随后在 location 块中使用 rewrite 将该标识作为跳转目标。

http {
# 定义 map 块,将 UA 映射到 is_mobile 变量
map $http_user_agent $is_mobile {
default 0;
~*Mobile 1;
}
server {
listen 80;
server_name example.com;
location / {
# 如果检测到移动设备,重写到 /mobile/
if ($is_mobile) {
rewrite ^(.*)$ /mobile/$1 last;
}
}
}
}
上述配置中,map 块定义了 $is_mobile 的值。若 User-Agent 匹配 ~*Mobile,则 $is_mobile 为 1。接着在 location 中使用 if 判断该变量,触发 rewrite 将请求前缀改为 /mobile/。last 标志表示重写后重新搜索 location。
如何根据 Referer 实现防盗链重写
针对静态资源防盗链需求,可以利用 map 指令检查 $http_referer 变量。将合法的域名映射为允许访问的状态码或标记,非法来源则映射为拒绝状态。配合 rewrite 或 return 指令,可以将非法请求重定向至错误页面或直接返回 403。

http {
# 定义 map 块,检查 Referer 是否合法
map $http_referer $valid_referer {
default 0;
~*example\.com 1;
~*baidu\.com 1;
}
server {
listen 80;
server_name example.com;
location ~* \.(jpg|jpeg|png|gif)$ {
root /var/www/html;
# 如果 Referer 不合法,重写到 /forbidden.html
if ($valid_referer = 0) {
rewrite ^/.*$ /forbidden.html last;
}
}
}
}
在此示例中,map 块将来自 example.com 或 baidu.com 的请求标记为 1,其他来源标记为 0。在图片资源的 location 中,若 $valid_referer 为 0,则通过 rewrite 将请求指向 /forbidden.html,从而实现动态的防盗链处理。
map 指令中的默认值如何处理未匹配项
在 map 指令中,default 关键字用于指定所有未匹配到上方正则或精确值的输入所对应的输出结果。这是处理动态重写逻辑的关键,确保任何请求都能获得确定的映射值,避免变量为空导致 rewrite 行为异常。例如,在前面的 User-Agent 示例中,非移动设备的请求会被映射为 0,从而跳过重写逻辑。











