Apache mod_rewrite运维关键在于三步:确认模块真实启用(a2enmod+apache2ctl验证)、放行目录重写权限(AllowOverride All+FollowSymLinks)、严格匹配上下文路径逻辑(.htaccess中路径不带前导斜杠、QUERY_STRING需单独捕获),调试须用curl和trace日志,禁用301缓存干扰。

Apache mod_rewrite 运维指南不是看“怎么写正则”,而是看清楚三件事:模块有没有真启用、目录权限有没有放行、规则写在哪个上下文里且是否匹配路径逻辑。它不靠炫技,靠的是每一步都踩准位置。
先确认 mod_rewrite 模块已加载并运行
光在配置里取消注释 LoadModule 不够,得验证它确实在内存中加载:
- Ubuntu/Debian 执行:sudo a2enmod rewrite && sudo systemctl restart apache2
- 然后检查:apache2ctl -M | grep rewrite,输出包含 rewrite_module (shared) 才算成功
- 如果用的是自编译 Apache 或旧版,需手动编辑 httpd.conf,确保有 LoadModule rewrite_module modules/mod_rewrite.so 且无 # 注释
再放开 .htaccess 的重写权限
模块开着,但 Apache 默认禁止目录级覆盖——这是 80% 规则不生效的根源:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 找到对应站点的 <Directory> 块(通常在虚拟主机配置或 apache2.conf 中)
- 把 AllowOverride None 改成 AllowOverride All
- 同时确保 Options 包含 FollowSymLinks(部分版本强制要求)
- 改完必须重启 Apache,.htaccess 修改本身不触发重启
写规则时盯紧路径和上下文
规则失效常因路径理解错位,尤其在 .htaccess 中:
- 根目录 .htaccess 里,^article/(\d+)$ 匹配 /article/123;写 ^/article/(\d+)$ 反而永远不匹配
- 子目录 /blog/.htaccess 中,规则匹配的是 post/456,不是 /blog/post/456
- QUERY_STRING(问号后参数)要单独用 RewriteCond 捕获,比如 RewriteCond %{QUERY_STRING} ref=([^&]+)
- 每条 RewriteRule 前必须有 RewriteEngine On,且不能遗漏 [L] 防止后续规则干扰
调试别靠刷新浏览器,要用 curl 和日志
浏览器缓存 301、HTTPS 自动跳转、Referer 干扰都会掩盖真实行为:
- 测试用:curl -I http://yoursite.com/old.html,看响应头是否含 Location 或 301/302
- 开启 trace 日志:LogLevel alert rewrite:trace3,查 error_log 看每条规则是否被触发、是否匹配、是否跳过
- 临时把规则简化为 RewriteRule ^test$ /index.html [L],先验证基础通路再加逻辑
- 重定向测试一律用 [R=302],避免 301 被缓存导致改了规则也看不出效果

















