写好 rewriterule 的关键在于理解 apache 请求路径解析机制、匹配时机及规则执行顺序,需兼顾精度、顺序与上下文;.htaccess 中模式不带开头斜杠,主配置中才需带;善用 l、qsa、nc 等标志,避免循环重写,结合 rewritecond 实现条件路由。

写好 RewriteRule 的关键,不在于堆砌正则,而在于理解 Apache 如何解析请求路径、何时触发重写、以及规则如何逐条匹配执行。真正有效的规则,必须兼顾匹配精度、执行顺序和上下文环境。
注意 RewriteRule 模式中不带开头斜杠
在 .htaccess 文件里,RewriteRule 的匹配模式默认针对的是“去除首斜杠后的相对路径”。比如用户访问 /product/iphone-15,Apache 实际传给 RewriteRule 匹配的是 product/iphone-15,而不是 /product/iphone-15。
- ❌ 错误写法:
RewriteRule ^/product/([^/]+)/?$ product.php?name=$1 [L](开头的/导致永远不匹配) - ✅ 正确写法:
RewriteRule ^product/([^/]+)/?$ product.php?name=$1 [L] - 如果规则放在主配置文件
httpd.conf的虚拟主机段内,则模式才需带开头/
用好标志位:L、QSA、NC 是高频刚需
标志(flags)决定规则行为,漏写或错用常导致逻辑异常或循环重写。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
[L]表示“最后一条”,匹配后停止后续规则处理;没有它,可能被后面规则二次改写 -
[QSA](Query String Append)让原始 URL 中的查询参数(如?utm_medium=email)自动追加到目标 URL 后,避免丢失追踪信息 -
[NC](No Case)忽略大小写,适合处理用户输入不规范的路径,如/ABOUT和/about统一映射 - 需要外部跳转时才加
[R=301];内部重写(地址栏不变)不加 R 标志
避免无限循环:警惕宽泛正则与无条件捕获
像 ^(.*)$ 这类通配模式极易引发重写循环——第一次把 /hello 改成 index.php?q=hello,第二次又把 index.php 当作新路径再匹配,最终变成 index.php?q=index.php。
- 优先使用更精确的模式,例如
^([a-z0-9_-]+)$代替^(.*)$ - 排除已知静态资源:在规则前加条件
RewriteCond %{REQUEST_FILENAME} !-f和!-d,确保真实存在的文件或目录不被重写 - 对入口脚本(如
index.php)显式排除:RewriteCond %{REQUEST_URI} !=/index.php
结合 RewriteCond 实现条件路由
单靠 RewriteRule 只能做简单映射;加入 RewriteCond 才能判断来源、设备、参数甚至文件状态,实现智能分发。
- 限制仅对不存在的路径重写:
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d - 识别移动端并跳转:
RewriteCond %{HTTP_USER_AGENT} "Android|iPhone|iPad" [NC]RewriteRule ^(.*)$ /mobile/$1 [L,R=302] - 防盗链保护图片:
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com [NC]RewriteRule \.(jpg|jpeg|png|gif)$ - [F] - 多条件组合可用
[OR],但默认是 AND 关系,无需额外声明










