You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx中redirect_maps为何对静态文件不生效?

Nginx redirect_map 静态文件不生效的解决方法

问题根源

  1. $request_uri匹配局限性:你用$request_uri作为map的匹配变量,但它包含完整请求路径(含查询参数),只有请求完全和规则一致(不带任何参数)才会匹配,带参数的静态文件请求直接失效。
  2. 文件存在性干扰指令执行:如果旧路径的静态文件还存在,try_files会直接返回原文件,后续的重定向判断不会触发。
  3. 正则表达式错误:第一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:25:36