Apache mod_rewrite不生效的根源在于“路没通”:一要启用mod_rewrite模块并验证其运行状态;二要在对应Directory块中将AllowOverride设为All以授权.htaccess执行;三要确保规则以RewriteEngine On开头、路径匹配格式正确、RewriteBase适配部署路径,且避开AllowEncodedSlashes等隐蔽陷阱。

Apache mod_rewrite 不生效,不是规则写得不对,而是“路没通”——模块没启、权限没开、规则没放对位置。三步卡点,缺一不可。
确认 mod_rewrite 模块已真正加载
光在配置里取消注释 LoadModule rewrite_module 不够,得验证它正在运行:
- Ubuntu/Debian:执行
sudo a2enmod rewrite && sudo systemctl restart apache2 - CentOS/RHEL:编辑
/etc/httpd/conf/httpd.conf,确保LoadModule rewrite_module modules/mod_rewrite.so这行未被注释,再执行sudo systemctl restart httpd - 统一验证方式:
apachectl -M | grep rewrite或httpd -M | grep rewrite,输出含rewrite_module (shared)才算成功
检查 .htaccess 是否被允许执行
模块开了,但 Apache 默认禁止目录级重写。必须在对应 <Directory> 块中显式授权:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 找到站点配置(如
/etc/apache2/sites-enabled/000-default.conf或/etc/httpd/conf/httpd.conf) - 定位到类似
<Directory "/var/www/html">的区块 - 把
AllowOverride None改成AllowOverride All - 建议同时加上
Options FollowSymLinks(部分旧版本必需)
验证规则本身是否合规
规则写错或放错位置,也会静默失效:
- 每份
.htaccess文件开头必须有RewriteEngine On - 路径匹配不加开头斜杠,比如写
^article/(\d+)$,而不是^/article/(\d+)$ - 避免误伤静态资源:用
RewriteCond排除assets/、images/、.png等真实文件路径 - 注意
[R]和内部重写的区别:带[R]是浏览器跳转(变 URL),不带才是后台转发(URL 不变)
留意几个隐蔽陷阱
有些问题不会报错,但会让规则完全不触发:
-
AllowEncodedSlashes:若 URL 含%2F(即编码后的/),Apache 会直接 404;需在虚拟主机中加AllowEncodedSlashes On -
RewriteBase:子目录部署时容易出错,比如站点绑在example.com/blog/,但.htaccess写了RewriteBase /,会导致路径错位 - POST 请求被
[R]重定向后降级为 GET,目标地址若只接受 POST,就会返回 405

















