nc标志使rewriterule或rewritecond的pattern部分不区分大小写匹配,如^about.php$可匹配/about.php、/about.php等,但不改变文件系统敏感性、不修改url显示、不自动转换路径大小写。
在虚拟主机中使用 mod_rewrite 的 nc(no case)标志,可以让重写规则对 url 路径不区分大小写匹配。但需注意:nc 仅作用于 规则中的 pattern(正则表达式部分),它不会自动将请求路径转为小写或大写,也不会改变服务器实际文件系统的大小写敏感性。
NC 标志的基本用法
NC 写在 RewriteRule 或 RewriteCond 的末尾,表示忽略大小写匹配:
-
RewriteRule ^about\.php$ /about-us.html [NC,L]—— 匹配/about.php、/ABOUT.PHP、/About.Php等所有大小写组合 -
RewriteCond %{REQUEST_URI} ^/blog/.*$ [NC]—— 条件判断时忽略大小写
常见误区与限制
NC 只影响匹配行为,不解决底层问题:
- Linux 文件系统默认区分大小写,
/Page.html和/page.html是两个不同文件;NC 匹配成功后若指向不存在的路径,仍会返回 404 - NC 不会重写 URL 中的大小写,浏览器地址栏显示不变;如需统一显示小写,需配合其他规则(如使用 RewriteMap 或外部脚本)
- Apache 2.4+ 对某些特殊字符或 Unicode 大小写处理有限,建议测试 ASCII 字母为主场景
实用配置示例
以下是在虚拟主机 .htaccess 或 <virtualhost></virtualhost> 中的典型用法:
-
统一跳转到小写路径(需配合重定向):
RewriteCond %{REQUEST_URI} [A-Z]<br> RewriteRule ^(.*)$ /${lower:$1} [R=301,L]
(注:此写法依赖 Apache 的lowerRewriteMap,需管理员启用,普通虚拟主机通常不支持) -
兼容旧链接,允许大小写混用访问同一页面:
RewriteRule ^products/([a-zA-Z0-9_-]+)\.html$ /products/detail.php?id=$1 [NC,L] -
屏蔽大小写变体的恶意访问(如防止 /ADMIN/ 被绕过):
RewriteRule ^(?i)admin/ - [F]——(?i)是内联标志,等效于 [NC]
验证与调试建议
启用重写日志(需管理员权限)或使用在线工具测试正则:
- 在
.htaccess开头添加RewriteLogLevel 3和RewriteLog "/path/to/log"(仅限 Apache 2.2;2.4+ 改用LogLevel alert rewrite:trace3) - 用浏览器访问不同大小写的 URL,观察是否触发预期跳转或内部重写
- 检查服务器响应头中的
Location(301/302 时)和实际返回内容,确认逻辑生效










