map 指令可在 http 块中基于 URI 后缀映射目录路径,配合 alias 实现动态路由;需设 default 值、正则末尾加斜杠、避免 root 拼接错误,并用 1+ 精确匹配末尾扩展名。./ ↩

用 map 指令实现基于文件后缀的动态目录切换路由,核心是把请求 URI 的扩展名映射为不同的本地路径前缀,再在 location 或 alias 中引用该变量。它不依赖 Lua,纯原生配置,适合静态资源按类型分目录托管(如 .js 走 /static/js/,.css 走 /static/css/)。
必须在 http 块中定义 map 规则
map 不能写在 server 或 location 内,否则 Nginx 启动会报错。需放在 http { } 最外层,通常在 upstream 声明之后、server 块之前:
- 源变量推荐用
$suffix(通过map自定义)或更直接的$1(配合正则捕获) - 实际常用方式是先用
rewrite或set提取后缀,但更简洁的做法是用map直接匹配$request_uri或$uri - 务必设
default,避免未匹配时变量为空导致 404 或路径错误
提取后缀并映射为目录路径
利用正则从 $uri 中捕获扩展名,再映射为对应子目录。例如:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
map $uri $static_root {
default "/var/www/static/default/";
~*\.(js|ts|map)$ "/var/www/static/js/";
~*\.(css|scss|sass)$ "/var/www/static/css/";
~*\.(png|jpg|jpeg|gif|webp|svg)$ "/var/www/static/img/";
~*\.(woff2|woff|ttf|eot)$ "/var/www/static/font/";
}-
~*表示忽略大小写的正则匹配 - 每个分支末尾带斜杠,方便后续
alias或root拼接完整路径 - 注意顺序:更具体的后缀(如
.min.js)应放在通用规则(如.js)之前,否则会被提前截断
在 location 中使用映射变量
在 server 块中,用 alias 配合 $static_root 实现目录切换:
location ~* \.(js|css|png|jpg|gif|svg|woff2|woff|ttf|eot|map|scss|sass)$ {
alias $static_root;
expires 1y;
add_header Cache-Control "public, immutable";
}-
alias会用变量值完全替换location匹配到的路径,所以$static_root必须以斜杠结尾 - 不要用
root+ 变量,因为root是拼接行为,而变量值已是完整路径前缀,易造成重复路径 - 该
location的正则仅用于触发匹配,实际路由逻辑由map决定,解耦清晰
补充:支持多级后缀与兜底优化
某些资源如 main.min.js 或 theme.dark.css 含多个点,需调整正则确保捕获最末后缀:
map $uri $static_root {
default "/var/www/static/default/";
~*\.[^./]+\.(js|ts|map)$ "/var/www/static/js/";
~*\.[^./]+\.(css|scss|sass)$ "/var/www/static/css/";
~*\.[^./]+\.(png|jpg|jpeg|gif|webp|svg)$ "/var/www/static/img/";
}-
[^./]+确保匹配最后一个点之前的非点非斜杠字符,避免误判dist/v1.2.0/app.js中的.2 - 若需记录匹配情况用于调试,可加
log_subrequest on;并在日志中输出$static_root - 上线前用
nginx -t校验语法,再nginx -s reload生效,全程无需重启


















