一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何在 Nginx 中配置将用户上传的不规范大写文件名在访问时自动重写转小写

时间:2026-08-06 13:58:49 编辑:袖梨 来源:一聚教程网

<p>最稳妥方式是用 rewrite + Lua(OpenResty)实现内部小写转换;若仅需301重定向则可用 if + rewrite permanent,但需限定 location 范围避免误伤;静态资源可借 ~* 不区分大小写匹配,但治本需统一文件名小写并配合路径改写。</p>

直接让 Nginx 在访问时把含大写字母的 URL 自动转成小写再处理,最稳妥的方式是用 rewrite + Lua(OpenResty),因为纯 Nginx 原生不支持对 URI 做字符串大小写转换;但若仅需“重定向到小写路径”(即浏览器地址栏变化),可用 if + rewrite permanent 实现。下面分两种常见需求说明:

需要 301 重定向(地址栏变小写)

适用于 SEO 友好、缓存统一或强制标准化入口。Nginx 原生支持,无需额外模块:

  1. server 或特定 location 块中添加:
if ($uri ~ [A-Z]) {rewrite ^(.*)$ $1 permanent;}

注意:

– 这会触发 301 跳转,用户看到的 URL 变成全小写;

$1 是原始 URI,Nginx 内部自动调用 string.lower() 类逻辑(实际由 rewrite 模块隐式处理大小写转换);

– 不建议放在根 location / 下全局启用,容易误伤带大写参数的 API;推荐限定范围,例如:

location /upload/ {if ($uri ~ [A-Z]) {rewrite ^(/upload/.*)$ $1 permanent;}try_files $uri =404;}

需要内部重写(地址栏不变,后端收到小写路径)

适用于上传文件存储为小写名,但用户仍可能用大写 URL 访问——此时不能只靠重定向,得把 URI 改写后透传给后端或文件系统:

  1. 必须启用 lua-nginx-module(即使用 OpenResty 或编译时加入 Lua 支持);
  2. location 中用 rewrite_by_lua_block$uri 转小写并重新发起内部请求:
location /upload/ {rewrite_by_lua_block {local lower_uri = string.lower(ngx.var.uri)if lower_uri ~= ngx.var.uri thenreturn ngx.exec(lower_uri)end}try_files $uri =404;}

✅ 效果:用户访问 /upload/IMG.JPG,Nginx 内部改用 /upload/img.jpg 查找文件,浏览器地址栏保持不变。

补充:静态资源可直接用 ~* 匹配绕过大小写问题

如果只是想让 .jpg.CSS 等后缀不区分大小写地命中同一规则(不改路径,只匹配),用 ~* 最轻量:

location ~* .(jpg|jpeg|png|gif|css|js|svg)$ {root /var/www/static;expires 1h;}

这样 /IMG.JPG/style.CSS 都能正确返回对应文件,但前提是文件系统里真有这些大小写混合的文件名——否则仍会 404。所以真正治本,还是得统一文件名全小写 + 配合上述重写逻辑

关键提醒:别忽略文件系统和后端

  1. Nginx 的 ~*rewrite 只改请求路径的“匹配”或“转发”,不改变磁盘上文件名本身;
  2. Linux 文件系统默认区分大小写,若上传目录里只有 logo.png,而用户请求 /LOGO.PNG,即使匹配成功,最终仍可能因找不到文件返回 404;
  3. 若后端是 MinIO/Tomcat 等服务,它们也区分大小写,Nginx 单纯 proxy_pass 原 URI 过去无效,必须用 Lua 或 proxy_set_header + rewrite break 配合修改 $request_uri

热门栏目