Nginx原生不支持URI大小写转换,需分场景处理:301重定向(if+rewrite,地址栏变小写)或Lua内部转换(OpenResty,地址栏不变);静态资源可配不区分大小写location兼容访问。

纯 Nginx 原生不支持对 URI 字符串做大小写转换,所以“自动把大写路径转成小写”这件事不能靠 rewrite 直接计算实现。实际方案分两类:一类是让浏览器地址栏变小写(301 重定向),另一类是内部悄悄转小写、用户无感(需 Lua 支持)。
用 if + rewrite 实现 301 重定向(地址栏变化)
这是最常用、无需额外组件的方式,适合标准化入口、SEO 友好或防止重复内容。核心是检测 URI 中是否含大写字母,再发起永久跳转:
- 在对应 location 块中添加:
if ($uri ~ [A-Z]) {
rewrite ^(.*)$ $1 permanent;
} - $uri 是当前请求路径(不含参数),正则
[A-Z]匹配任意大写字母 -
permanent触发 301 跳转,浏览器地址栏会刷新为全小写形式 - 务必限定作用范围,比如只放在
location /static/或location /upload/下,避免误伤 API 接口或带大写参数的合法路径
用 OpenResty + Lua 实现内部重写(地址栏不变)
当后端或文件系统只认小写文件名,但你又不希望用户看到跳转(比如上传页 URL 大写访问仍要正常返回内容),就必须在 Nginx 内部完成转换并继续处理:
- 需使用 OpenResty 或编译时启用
lua-nginx-module - 在 location 中加入:
rewrite_by_lua_block {
ngx.var.uri = string.lower(ngx.var.uri)
} - 这行代码会把当前
$uri值转为小写,并继续走后续流程(如try_files或proxy_pass) - 注意:该操作发生在 rewrite 阶段,不影响原始请求头和参数,用户完全无感知
补充建议:静态资源可配合不区分大小写匹配
如果只是想让图片、CSS 等静态资源支持大小写混访(不改名也不跳转),可用 location ~* \.(jpg|png|css|js)$ 这类不区分大小写的正则匹配,再配合 try_files 查找文件。但这只是“兼容访问”,不是真正“转小写”,文件系统里名字仍是原样。
治本做法还是上传时统一转小写保存,再配合上述任一方式确保访问路径标准化。


















