如何实现大写西里尔字母URL转小写的301重定向以解决404错误?
解决LiteSpeed服务器西里尔大写URL转小写301重定向问题
方法1:用Unicode属性修正匹配规则
原规则的字符匹配可能没覆盖全大写西里尔字母,或者LiteSpeed对REQUEST_URI的编码处理导致匹配失效。试试用Unicode大写字母属性匹配(多数新版LiteSpeed默认支持):
RewriteEngine On # 匹配包含任意大写字母(含拉丁、西里尔)的请求路径 RewriteCond %{REQUEST_URI} \p{Lu} RewriteRule ^(.*)$ /${tolower:$1} [R=301,L,NE]
加上NE标志是为了防止重定向时西里尔字母被转义,保证URL正确显示。
方法2:明确列出大写西里尔字母范围
如果Unicode属性匹配不生效,直接把所有大写西里尔字母(包括Ё这类扩展字符)列出来匹配:
RewriteEngine On # 匹配大写拉丁或西里尔字母 RewriteCond %{REQUEST_URI} [A-ZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ] RewriteRule ^(.*)$ /${tolower:$1} [R=301,L,NE]
注意把.htaccess文件保存为无BOM的UTF-8编码,不然字符匹配会乱码。
方法3:PHP脚本兜底处理
要是Rewrite规则始终不管用,用PHP脚本实现逻辑更稳妥:
- 在网站根目录创建
redirect-lowercase.php,代码如下:
<?php $requestUri = $_SERVER['REQUEST_URI']; // 检查是否存在大写西里尔或拉丁字母 if (preg_match('/[A-ZА-ЯЁ]/u', $requestUri)) { $lowercaseUri = mb_strtolower($requestUri, 'UTF-8'); header("Location: https://{$_SERVER['HTTP_HOST']}{$lowercaseUri}", true, 301); exit; } // 没有大写字符就继续处理原请求 include $_SERVER['SCRIPT_NAME']; ?>
- 在.htaccess里添加规则,把符合条件的请求转去脚本:
RewriteEngine On RewriteCond %{REQUEST_URI} [A-ZА-ЯЁ] RewriteRule ^(.*)$ /redirect-lowercase.php [L]
必做检查项
- 确认LiteSpeed虚拟主机配置里开了
AllowOverride All,不然.htaccess规则不会生效。 - 测试前清除浏览器缓存,旧的301缓存会干扰结果。
- 确保重定向规则放在.htaccess的最前面,别被其他规则(比如404处理)覆盖。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

