apache mod_rewrite最佳实践是守住模块启用、权限放开、规则写准、作用域明确四点:必须启用并验证模块运行,allowoverride设为all或fileinfo,路径匹配不加开头斜杠,rewriterule后加[l],并用!-f和!-d排除真实文件目录。

Apache mod_rewrite 的最佳实践不是堆砌高级技巧,而是守住几个关键动作不犯错——模块启用、权限放开、规则写准、作用域明确。这四点没做对,再精巧的正则也白搭。
必须启用并验证 mod_rewrite 模块
模块没真正加载,所有规则都无效。不能只看配置文件里有没有那行 LoadModule,得确认它在运行中:
- Debian/Ubuntu:执行 sudo a2enmod rewrite && sudo systemctl restart apache2
- CentOS/RHEL:检查 /etc/httpd/conf.modules.d/00-base.conf 或 httpd.conf 中 LoadModule rewrite_module modules/mod_rewrite.so 已取消注释
- 验证是否生效:运行 apache2ctl -M | grep rewrite(或 httpd -M | grep rewrite),看到 rewrite_module (shared) 才算成功
AllowOverride 必须设为 All(或至少 FileInfo)
即使模块开着,Apache 默认禁止 .htaccess 使用重写指令。这个开关不开,.htaccess 里的 RewriteRule 全部被忽略:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在对应虚拟主机或主配置的
块中,把 AllowOverride None 改成 AllowOverride All - 若仅需重写功能,AllowOverride FileInfo 也足够,更安全
- 同时确保 Options +FollowSymLinks 已启用,否则部分规则会触发 500 错误
- 改完必须重启 Apache,否则配置不生效
规则必须写在正确位置,路径匹配不加开头斜杠
VirtualHost 下的规则不能直接写在
- 匹配路径用 ^article/,不是 ^/article/(开头斜杠在 .htaccess 和
中会被自动剥离) - 每条 RewriteRule 后建议加上 [L],避免后续规则误触发
- 条件判断 RewriteCond 只对紧随其后的那一条 RewriteRule 生效,不能复用
- 避免同时在
和同目录下 .htaccess 写规则,容易重复执行或优先级混乱
加条件排除真实文件和目录
很多伪静态规则出问题,是因为没过滤掉真实存在的资源,导致 CSS、JS、图片也被重写:
- 在主要规则前加上:RewriteCond %{REQUEST_FILENAME} !-f(不是真实文件)
- 再加上:RewriteCond %{REQUEST_FILENAME} !-d(不是真实目录)
- 这样能确保静态资源正常加载,只对不存在的路径做重写









