nginx 可通过 location、try_files、map、变量及 rewrite 等机制,在不依赖后端情况下实现静态资源的路径重写、条件返回、访问控制、缓存策略切换与存在性模拟;需配合日志验证与语法测试。

可以通过 Nginx 的 location 匹配、try_files、变量控制、以及 rewrite + if(谨慎使用)等机制,在不依赖后端的前提下,对静态资源请求实现自定义处理逻辑,比如路径重写、条件返回、访问控制、缓存策略切换、甚至模拟资源存在性。
用 location 精准匹配并定制行为
静态资源通常有明确路径特征(如 /static/、.js、.png),可用 location 块做细粒度控制:
- 前缀匹配:
location /assets/ { root /data/www; }指向特定目录 - 扩展名匹配:
location ~* \.(js|css|webp|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; }统一设置强缓存 - 正则捕获用于动态路径解析:
location ~ ^/v(\d+)/img/(.+)$ { alias /data/images/$2; }实现版本化路径映射
用 try_files 实现“fallback 式”资源查找逻辑
try_files 不仅用于 PHP 路由,也适用于静态资源的多级兜底策略:
- 按优先级尝试多个路径:
try_files $uri $uri/index.html /404.html; - 结合变量构造路径:
try_files /cdn$uri /fallback$uri =404;支持 CDN 回源或降级存储 - 配合
error_page实现透明重定向:error_page 404 = @missing; location @missing { return 302 /placeholder.png; }
基于请求特征动态干预响应
利用内置变量(如 $arg_v、$http_user_agent、$sent_http_content_type)可让静态响应具备上下文感知能力:
- 按参数提供不同版本:
if ($arg_format = "webp") { add_header X-Format "webp"; }(注意:if 在 location 外慎用) - 根据 User-Agent 返回适配资源:
if ($http_user_agent ~* "iPhone") { set $device "mobile"; },再用try_files /img/$device/$uri /img/default/$uri =404; - 限制 Referer 防盗链:
valid_referers none blocked *.example.com; if ($invalid_referer) { return 403; }
用 map 构建轻量配置路由表
比嵌套 if 更高效、更可维护的方式是用 map 提前计算变量值:
- 定义资源类型映射:
map $uri $cache_ttl { ~\.html$ "0"; ~\.(js|css|json)$ "1h"; default "1d"; } - 在 server 或 location 中直接使用:
expires $cache_ttl; - 还可映射到不同 root 或 upstream:
map $host $backend_root { example.com "/var/www/prod"; test.example.com "/var/www/staging"; },再root $backend_root;
不复杂但容易忽略:所有自定义逻辑都应配合日志记录(log_format + $request_uri、$status、$upstream_http_x_cache 等)来验证是否生效。上线前务必用 nginx -t 校验语法,并用 curl -I 测试响应头与状态码是否符合预期。











