apache rewriterule 本质是用pcre匹配uri路径(不含域名和查询参数),通过捕获组提取变量交由后端统一处理;查询参数需用rewritecond单独捕获,传参用[qsa],兜底路由+后端分发优于硬写万条规则,必须加[l]防止规则链误执行。

Apache 的 RewriteRule 本质是用 Perl 兼容正则(PCRE)匹配请求路径(不包含域名和查询参数),再通过捕获组提取关键部分,交给后端统一处理。写得“复杂”不是目标,关键是把 URL 中的可变模式抽象出来,避免硬编码、逐条写规则。
先抓准匹配对象:只看路径,不看 ? 后面
RewriteRule 默认只处理 URI 路径部分,比如访问 /blog/post-123?ref=abc&utm=1,它只看到 /blog/post-123。查询参数要单独用 RewriteCond 提取:
-
RewriteCond %{QUERY_STRING} ref=([^&]+)→ 把ref=abc中的abc捕获到%1 - 想保留所有原参数传给目标?加
[QSA]标志,例如RewriteRule ^/old/(.*)$ /new.php [QSA,L]
常用结构写法,记住这几种就够用
不用背全量正则,掌握高频组合能覆盖绝大多数场景:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
^/news/(\d+)$→ 匹配/news/2026,\d+表示一个或多个数字,捕获到$1 -
^/product/([^/]+)/(\d{4})$→ 匹配/product/iphone/2026,[^/]+表示“不含斜杠的任意字符”,\d{4}限定四位数字 -
^/api/v\d+/.*$→ 匹配所有/api/v1/xxx、/api/v2/users等,v\d+泛化版本号 -
^/$或^$→ 匹配首页(空路径或仅斜杠)
万级 URL 不要列一万条规则
硬写上万条 RewriteRule 会严重拖慢请求处理速度,平均要遍历几千条才命中。正确做法是一条规则兜底 + 后端路由分发:
- 错误示范:
RewriteRule ^/item-123\.html$ /p.php?id=123 [L](每新增一个商品就得加一条) - 正确写法:
RewriteRule ^/item/([a-zA-Z0-9_-]+)/?$ /router.php?slug=$1 [L,QSA],所有/item/xxx都进同一个入口,由 PHP 查数据库或缓存返回内容 - 好处:增删页面不改 Apache 配置,支持热更新,CPU 开销稳定
必须加 [L],否则容易出错
没有 [L] 的规则可能被后续规则再次改写,导致跳转错误、404 或无限重定向循环:
-
RewriteRule ^/old/(.*)$ /new.php?id=$1→ 缺少[L],如果后面还有规则匹配/new.php,就会继续执行 - 应写作:
RewriteRule ^/old/(.*)$ /new.php?id=$1 [L],命中即停止 - 多个条件组合时,
[L]也建议放在最后一条关联规则之后,防止意外穿透










