Nginx中redirect_maps为何对静态文件不生效?
Nginx redirect_map 静态文件不生效的解决方法
问题根源
$request_uri匹配局限性:你用$request_uri作为map的匹配变量,但它包含完整请求路径(含查询参数),只有请求完全和规则一致(不带任何参数)才会匹配,带参数的静态文件请求直接失效。- 文件存在性干扰指令执行:如果旧路径的静态文件还存在,
try_files会直接返回原文件,后续的重定向判断不会触发。 - 正则表达式错误:第一个if里的匹配规则缺少点的转义符
\,写成.(gif|...)会错误匹配非后缀的字符组合(比如testgif),应该修正为\.(gif|...)。
修正后的配置方案
方案1:改用$uri匹配并调整执行顺序
map $uri $redirect_uri{ # 可批量添加需要重定向的图片路径 /images/2022/stackoverflow.png /images/newfolder/stackoverflow.png; } server { # 省略敏感配置... location / { # 修正正则的转义符 if ($request_filename !~* \.(gif|webp|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) { rewrite ^([^.]*[^/])$ $1/ permanent; } # 将重定向判断放在try_files之前,确保即使原文件存在也触发重定向 if ($redirect_uri) { # 保留原请求的查询参数 return 301 $redirect_uri$is_args$args; } try_files $uri $uri/ =404; } }
方案2:单独针对图片路径配置(更高效)
如果仅需重定向图片文件,建议单独配置location规则,避免和其他请求逻辑混淆:
map $uri $redirect_uri{ /images/2022/stackoverflow.png /images/newfolder/stackoverflow.png; } server { # 省略敏感配置... # 优先处理图片请求 location ~* \.(png|jpe?g|webp|gif)$ { if ($redirect_uri) { return 301 $redirect_uri$is_args$args; } try_files $uri $uri/ =404; } location / { if ($request_filename !~* \.(json|ico|js|css|flv|swf|pdf|xml)$ ) { rewrite ^([^.]*[^/])$ $1/ permanent; } try_files $uri $uri/ =404; } }
额外优化技巧
如果要批量重定向整个2022文件夹下的所有PNG图片,可使用map的正则匹配简化规则:
map $uri $redirect_uri{ ~^/images/2022/(.*\.png)$ /images/newfolder/$1; }
内容的提问来源于stack exchange,提问作者onerom
相关产品推荐
相关产品推荐

