apache mod_rewrite的进阶能力在于精准控制匹配范围、条件组合、重写语义和执行顺序;关键是要理解规则在请求生命周期中的位置与作用,而非堆砌复杂正则或标志。

Apache mod_rewrite 的进阶能力不在正则多复杂,而在于精准控制匹配范围、条件组合、重写语义和执行顺序。真正用好它,关键不是堆砌标志,而是理解每条规则在请求生命周期中的位置与作用。
匹配路径要准:URI path 不含协议、域名、查询串
RewriteRule 默认只处理请求的路径部分(即 REQUEST_URI 中 ? 之前的部分),且不自动带开头斜杠(尤其在 .htaccess 中):
- 在网站根目录 .htaccess 中,
^article/(\d+)$能匹配/article/123,但^/article/(\d+)$永远不匹配——开头的/是多余的 - 在子目录
/blog/下的 .htaccess 中,^post/(\d+)$匹配的是post/456,不是/blog/post/456 - 想处理
?ref=abc这类参数,必须用RewriteCond %{QUERY_STRING} ref=([^&]+)单独捕获,再通过[QSA]或手动拼接传入目标
条件判断要稳:RewriteCond 是规则生效的前提
单靠 RewriteRule 很难应对真实场景,RewriteCond 提供上下文判断能力:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RewriteCond %{REQUEST_FILENAME} !-f:当前请求路径不是真实文件 → 防止静态资源被误转发 -
RewriteCond %{REQUEST_FILENAME} !-d:不是真实目录 → 常与上一条联用,实现“不存在即走入口” -
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]:精确匹配主机名,[NC]忽略大小写,\.转义点号 - 多个 RewriteCond 默认是 AND 关系;加
[OR]可实现 OR 逻辑,但需谨慎避免误触发
重写与重定向必须分清:L 和 R 的组合决定行为本质
是否加 [R] 决定浏览器地址栏是否变化,[L] 决定后续规则是否继续执行:
- 内部重写(无 R):
RewriteRule ^product/([^/]+)/([0-9]{4})$ /product.php?brand=$1&year=$2 [QSA,NC,L]→ 用户看到/product/iphone/2026,后端收到完整参数,零跳转开销 - 外部重定向(带 R):
RewriteRule ^old-page\.html$ /new-page [R=301,L]→ 浏览器跳转,搜索引擎更新索引,旧 URL 失效 - 混合使用时顺序敏感:先强制 HTTPS(
R=301),再统一 www(R=301),最后路由到 PHP 入口(无 R +L);漏掉L可能导致重定向后又被下一条规则二次处理 - 调试阶段一律用
[R=302],避免 301 被缓存导致规则修改不生效
高频实用模式:可直接复用的进阶写法
以下规则均假设已启用 RewriteEngine On,放在根目录 .htaccess 中:
-
统一入口(Front Controller):
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php?$1 [QSA,L] -
隐藏 .php 后缀并支持带参访问:
RewriteCond %{REQUEST_FILENAME}.php -fRewriteRule ^(.*)$ $1.php [QSA,L] -
禁止 hotlink(防盗链):
RewriteCond %{HTTP_REFERER} !^$RewriteCond %{HTTP_REFERER} !example\.com [NC]RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F] -
强制 www + HTTPS 组合(生产环境推荐):
RewriteCond %{HTTPS} off [OR]RewriteCond %{HTTP_HOST} !^www\. [NC]RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]










