rewriterule 本身不支持直接用 ! 取反匹配,因为 ! 是 rewritecond 的前缀修饰符,非正则语法;正确做法是先用 rewritecond 判断“不匹配”,再执行 rewriterule,如 rewritecond %{request_uri} !^/admin/ && rewriterule ^(.*)$ /index.php [l]。

RewriteRule 本身**不支持直接用 ! 取反匹配**。感叹号 ! 只能在 RewriteCond 中使用,作用于 CondPattern(条件模式),表示“不满足该条件时才继续执行后续规则”。
为什么 RewriteRule 不能加 !
因为 RewriteRule 的 Pattern 是正则表达式,而 ! 不是正则语法的一部分。Apache 明确规定:! 是 RewriteCond 的前缀修饰符,不是 RewriteRule 的合法语法。试图写成 RewriteRule !^old\.html$ /new.html 会导致配置解析失败或完全不生效。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
正确取反逻辑的写法
要实现“非某路径就执行重写”,必须拆成两步:先用 RewriteCond 判断“不匹配”,再用 RewriteRule 执行动作。常见组合如下:
-
排除某个具体路径:
RewriteCond %{REQUEST_URI} !^/admin/RewriteRule ^(.*)$ /index.php [L]
→ 所有非 /admin/ 开头的请求,都交给 index.php 处理 -
排除真实存在的文件或目录(典型前端控制器):
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php [L]
→ 只有当请求路径既不是真实文件、也不是真实目录时,才重写到入口文件 -
排除特定主机名:
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
→ 非 www.example.com 的访问,全部 301 跳转过去
注意几个关键细节
! 必须紧贴 CondPattern,中间不能有空格,例如 !^/api/ ✅,! ^/api/ ❌;
正则中的特殊字符(如 .、?、*)仍需按规则转义,! 不影响转义逻辑;
多个 RewriteCond 默认是 AND 关系,所有条件都满足(含否定条件)才会触发 RewriteRule。









