Nginx 本身不支持 URI 大小写自动转换,推荐使用 OpenResty + Lua 脚本在 rewrite_by_lua_block 中提取 path 并用 string.lower() 转小写后 301 重定向;纯 Nginx 方案需编译启用 perl 模块并配合 perl_set 和 lc() 函数实现,手动正则替换不可行。

Nginx 本身不支持直接对 URI 进行大小写转换(比如把 /AbC/DeF 自动转成 /abc/def),但可以通过 map 指令配合 Perl 兼容正则(PCRE)的 lowercase 功能,或借助 Lua 模块实现。不过最稳定、无需额外模块的方式是使用 Nginx 的 perl 模块(需编译时启用)或更通用的方案:用 return 301 + 正则匹配 + 手动枚举常见大写组合——但这不现实。实际生产中,推荐使用 Perl 模块 或 nginx-lua(OpenResty),其中 OpenResty 更常用且易维护。
✅ 方案一:用 OpenResty + Lua 脚本自动转小写(推荐)
如果你使用的是 OpenResty(Nginx + Lua),可以在 server 块中加入 Lua 逻辑,在请求进入 upstream 前统一将 URI 转为小写并重定向:
- 确保已安装 OpenResty(自带 ngx_http_lua_module)
- 在
location /或对应 location 中添加如下代码:
location / {
# 若 URI 包含大写字母,则 301 重定向到小写版本
if ($request_uri ~ [A-Z]) {
set $lower_uri "";
rewrite_by_lua_block {
local uri = ngx.var.request_uri
-- 提取 path 部分(去掉 query string)
local path, query = string.match(uri, "^([^?]*)(.*)$")
if path then
path = string.lower(path)
ngx.redirect(path .. query, 301)
end
}
}
}
</font><p>⚠️ 注意:<code>if</code> 在 location 中慎用,但此处仅用于触发 Lua,影响有限;更严谨可全用 <code>rewrite_by_lua_block</code> 判断,避免 if。</p><H3>✅ 方案二:纯 Nginx(无 Lua)+ perl 模块(需编译支持)</H3><p>如果 Nginx 编译时启用了 <code>--with-http_perl_module</code>,可利用 Perl 的 <code>lc()</code> 函数:</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill6848" title="Nginx Hosting"><img
src="https://img.php.cn/upload/skill/000/000/081/179116929868126.jpg" alt="Nginx Hosting" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill6848" title="Nginx Hosting">Nginx Hosting</a>
<p>通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。</p>
</div>
<a href="/xiazai/skill6848" title="Nginx Hosting" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><ul><li>在 <code>http</code> 块顶部添加:</li></ul><font color="gray"><pre class="brush:php;toolbar:false;">
perl_set $lower_uri '
sub {
my $r = shift;
my $uri = $r->uri;
return lc($uri);
}
';
- 然后在 server 或 location 中判断并跳转:
if ($uri ~ [A-Z]) {
return 301 $scheme://$host$lower_uri$request_uri;
}
⚠️ 注意:$request_uri 包含 query string,而 $uri 不含;上面示例中 $lower_uri 只处理 path,若需保留 query,应拼接 $args 或用 $request_uri 解析。
❌ 不推荐:纯正则手动替换(不可行)
Nginx 的 rewrite 不支持动态大小写转换。例如不能写 rewrite ^/(.*)$ /${lower:$1} last; —— 这种语法不存在。试图用几十条 rewrite ^/A(.*)$ /a$1 permanent; 规则覆盖所有字母,既难维护又无法处理嵌套路径,实际不可用。
? 补充建议:兼顾 SEO 和体验
- 重定向必须用 301,让搜索引擎合并权重
- 避免循环重定向:确保小写 URI 不再触发规则(如加条件
if ($uri != $lower_uri)) - 静态资源(CSS/JS/IMG)也应统一路径风格,防止因大小写差异导致 404
- 应用层最好同步规范 URL 输出(如 CMS 生成链接时全小写),Nginx 层作为兜底
不复杂但容易忽略:大小写问题本质是 URL 规范化,核心目标是让同一资源只有唯一 URL。Nginx 层做 301 是最快见效的手段,长期仍需前后端协同治理。

















