RewriteRule仅匹配URL路径部分(不含协议、域名、查询参数),.htaccess中路径不能以/开头,需用RewriteCond配合%{QUERY_STRING}处理查询参数,并务必添加[L]终止规则链。

RewriteRule 的匹配规则核心是“只匹配 URL 路径部分(不含协议、域名、查询参数)”,且写法高度依赖上下文(.htaccess 还是 VirtualHost 配置),不是照搬正则就能生效。
路径匹配必须去掉开头斜杠(尤其在 .htaccess 中)
在站点根目录的 .htaccess 文件里,Apache 会自动剥离当前目录前缀,所以规则里的路径不能以 / 开头:
- ✅ 正确:
RewriteRule ^article/([0-9]+)\.html$ /article.php?id=$1 [L]
能匹配/article/123.html - ❌ 错误:
RewriteRule ^/article/([0-9]+)\.html$ ...
开头多了一个/,永远不匹配 - 子目录(如
/blog/)下的.htaccess同理:匹配post/456,不是/blog/post/456
常用正则写法与含义要记牢
不用死背复杂表达式,掌握这几个高频组合就够日常使用:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
^news/(\d+)$→ 匹配/news/123,\d+等价于[0-9]+,捕获数字给$1 -
^product/([^/]+)/(\d{4})$→ 匹配/product/iphone/2026,[^/]+表示“不含斜杠的任意字符” -
^api/v\d+/.*$→ 匹配所有以/api/v1/、/api/v2/开头的路径 -
^$或^/$→ 匹配首页(空路径或仅斜杠)
想匹配查询参数?得用 RewriteCond 单独抓
RewriteRule 默认不处理 ? 后面的内容。要基于参数做判断,必须配合 RewriteCond:
- 提取
?ref=abc:RewriteCond %{QUERY_STRING} ref=([^&]+)→ 捕获值到%1 - 保留原有参数传给目标:
[QSA]标志自动追加,比如RewriteRule ^page/(.*)$ /index.php [QSA,L] - 手动拼接参数:
RewriteRule ^old/(.*)$ /new.php?from=old&id=$1 [L]
务必加 [L] 防止规则链误触发
没有 [L] 的规则可能被后续规则二次改写,导致 404 或无限循环:
-
RewriteRule ^admin/ - [L]→ 直接终止,不让其他规则碰/admin/下任何请求 -
RewriteRule ^(.*)$ /index.php [L]→ 兜底规则,放最后,确保只执行一次 - 多个规则共存时,
[L]不代表“全局结束”,只是本轮停止;真要跳过整套逻辑,得靠环境变量 +RewriteCond

















