rewritecond必须配合rewriterule且启用rewriteengine才生效;常见失效原因包括未开启重写、作用域不匹配、变量拼写错误、正则未锚定、and/or逻辑误用及phpenv中.htaccess被禁用。

RewriteCond 在 phpEnv 环境下必须配合 RewriteRule 才能生效,单独写 RewriteCond 不会触发任何跳转。
为什么 RewriteCond 总是不执行?
常见现象是:写了多条 RewriteCond,但请求完全没按预期跳转,甚至 404 或直通原路径。根本原因通常是以下之一:
-
RewriteEngine on没启用 —— phpEnv 的 Apache 默认关闭重写,必须在对应作用域(httpd.conf、vhosts.conf或.htaccess)里显式开启 - 作用域不匹配 —— 比如把
RewriteCond写在.htaccess里,但父目录的AllowOverride是None,导致文件被忽略 - 条件变量拼错 ——
%{HTTP_USER_AGENT}写成%{USER_AGENT},或%{REQUEST_FILENAME}实际指向的是重写后的路径而非原始请求路径 - 正则未加锚定 ——
RewriteCond %{HTTP_HOST} test.cn会匹配www.test.cn和test.cn.example.com,应写成^test.cn$并加[NC]
phpEnv 中 RewriteCond 常用测试变量与场景
phpEnv 基于 Windows + Apache,变量行为与 Linux 一致,但要注意路径分隔符和大小写敏感性(Windows 文件系统不区分大小写,但 %{REQUEST_URI} 仍是原始大小写):
-
%{HTTP_HOST}:用于域名判断,如强制 www 跳转 ——RewriteCond %{HTTP_HOST} !^www.example.com$ [NC] -
%{REQUEST_FILENAME}:判断真实文件/目录是否存在,常配合静态资源放行 ——RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d -
%{HTTP_REFERER}:防盗链常用,但注意空 Referer(直接访问)不会匹配 ——RewriteCond %{HTTP_REFERER} !^https?://(www.)?example.com [NC] -
%{QUERY_STRING}:匹配 URL 参数,比如拦截含id=123的请求 ——RewriteCond %{QUERY_STRING} ^id=123$
多个 RewriteCond 组合时的 AND/OR 陷阱
默认所有 RewriteCond 是 AND 关系,即全部满足才触发后续 RewriteRule;要实现 OR,必须显式标注 [OR],且顺序不能错:
- 错误写法:
RewriteCond %{HTTP_HOST} ^a.com$<br>RewriteCond %{HTTP_HOST} ^b.com$ [OR]<br>RewriteRule ^(.*)$ http://c.com/$1 [R=301,L]—— 第二个条件带[OR],但第一个没标,实际逻辑是「a.com AND (b.com OR ...)」,永远不成立 - 正确写法(两个域名任一匹配):
RewriteCond %{HTTP_HOST} ^a.com$ [OR]<br>RewriteCond %{HTTP_HOST} ^b.com$<br>RewriteRule ^(.*)$ http://c.com/$1 [R=301,L] - 混合逻辑(a.com 且非移动端):
RewriteCond %{HTTP_HOST} ^a.com$<br>RewriteCond %{HTTP_USER_AGENT} !Mobile [NC]<br>RewriteRule ^/api/(.*)$ /legacy/api.php?$1 [L]
phpEnv 下 .htaccess 中 RewriteCond 的特殊限制
phpEnv 的 Apache 默认禁用 .htaccess 解析,即使你写了规则也不会运行。必须手动修改对应虚拟主机配置(通常在 phpEnvApacheconfhosts.conf):
- 找到对应
<virtualhost></virtualhost>块,在DocumentRoot下方添加:AllowOverride All - 同时确保该目录有
Options FollowSymLinks(否则RewriteEngine on会报 500 错误) -
.htaccess中不能出现RewriteBase以外的服务器级指令(如LoadModule),否则直接 500 - Windows 路径中反斜杠
在正则里需双写为\,但绝大多数情况用正斜杠/更安全
最易被忽略的一点:phpEnv 的 Apache 日志默认不记录重写过程。调试时务必在 httpd.conf 或虚拟主机配置里加上 RewriteLogLevel 3 和 RewriteLog "logs/rewrite.log"(Apache 2.4+ 改用 RewriteLog 已废弃,应改用 LogLevel alert rewrite:trace3),否则所有条件是否匹配全靠猜。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











