Apache RewriteCond 默认不启用正则匹配,必须显式使用 ~、!~ 等操作符才能激活正则功能;其第三个参数为正则模式,需配合 %{变量} 和操作符(如 ~"^/api/")使用,否则 ^、$ 等符号被当作字面量处理。

Apache 的 RewriteCond 本身不直接写正则,而是通过它的第三个参数(条件模式)来匹配字符串,而这个模式支持正则表达式 —— 但只在使用 ~、!~ 这类正则操作符时才生效。
必须用 ~ 或 !~ 才启用正则
默认情况下,RewriteCond 使用的是字符串比较(如 =、!=、-f 等)。要启用正则匹配,必须显式使用:
-
~:表示“匹配正则”(区分大小写) -
!~:表示“不匹配正则”(区分大小写) -
~*:不区分大小写的正则匹配 -
!~*:不区分大小写的正则不匹配
例如,想匹配所有以 /api/ 开头的请求路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteCond %{REQUEST_URI} ^/api/
⚠️ 错误写法(没加 ~):RewriteCond %{REQUEST_URI} ^/api/
这会被当作字面量字符串比较,^/api/ 就是纯文本,不是正则。
常用变量和正则组合示例
正则写在哪?写在 RewriteCond 的第三个参数里,前面是变量(如 %{HTTP_HOST}、%{REQUEST_URI}),中间是操作符,后面是正则模式:
- 匹配子域名(如
blog.example.com):RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.com$ [NC][NC]表示不区分大小写;注意点号.要转义为\. - 排除多个静态资源后缀:
RewriteCond %{REQUEST_URI} !\.(js|css|png|jpg|gif|ico)$ [NC] - 匹配带查询参数的特定 URL:
RewriteCond %{QUERY_STRING} ^id=\d+&type=article$
注意:这里用~可省略(因为默认不启用正则,但^和$在无操作符时无效),所以正确写法是:RewriteCond %{QUERY_STRING} ^id=\d+&type=article$
实际上 Apache 会自动识别开头结尾锚点 → 但更稳妥仍建议显式加~:RewriteCond %{QUERY_STRING} ~"^id=\d+&type=article$"
常见坑和注意事项
- 正则中的特殊字符(
.、?、+、*、^、$、( )、[ ])必须按 PCRE 规则转义,尤其是.(匹配任意字符)要写成\. -
%{REQUEST_URI}始终以/开头,且不包含查询字符串(?xxx);查询参数要用%{QUERY_STRING} - 正则匹配成功后,捕获组(如
(...))可在后续RewriteRule中用$1、$2引用,但 不能 在同一个RewriteCond内用$1—— 那是RewriteRule的上下文 - 多个
RewriteCond默认是 AND 关系;加[OR]标志可改为 OR
调试技巧:怎么确认正则是否生效
开启 Apache 重写日志(仅开发环境):
- 在虚拟主机或主配置中添加:
RewriteLogLevel 3<br>RewriteLog "/var/log/apache2/rewrite.log"
(Apache 2.4+ 改用RewriteEngine On+LogLevel alert rewrite:trace3) - 查看日志中每条
RewriteCond的匹配结果,比如:strip per-dir prefix: /test/ -> test/<br>applying pattern '^/api/' to uri 'test/'<br>matched

















