apache mod_rewrite生效需三步:启用模块(a2enmod或取消注释loadmodule)、设置allowoverride all授权.htaccess、编写正确规则(rewriteengine on开头,匹配path不加/,区分[r]重定向与内部重写)。

Apache mod_rewrite 是 URL 重写的主力模块,不是装上就能用,得配对、写准、测稳。核心就三步:启用模块、放开权限、写对规则。跳过任一环节,.htaccess 里的 RewriteRule 都不会生效。
确认并启用 mod_rewrite 模块
模块没加载,一切规则都是空谈。不能只看有没有那行配置,得验证它真在运行。
- Linux(Debian/Ubuntu)执行:sudo a2enmod rewrite && sudo systemctl restart apache2
- Linux(CentOS/RHEL)编辑 /etc/httpd/conf/httpd.conf,取消注释:LoadModule rewrite_module modules/mod_rewrite.so
- 验证是否生效:apache2ctl -M | grep rewrite 或 httpd -M | grep rewrite,看到 rewrite_module (shared) 才算成功
允许 .htaccess 使用重写指令
即使模块开着,Apache 默认禁止目录级重写。必须显式授权,否则 .htaccess 里写再多 RewriteRule 也视而不见。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 找到对应站点的
块(可能在 httpd.conf、apache2.conf 或虚拟主机配置里) - 把 AllowOverride None 改成 AllowOverride All
- 同时确保 Options 包含 FollowSymLinks(部分旧版要求)
- 改完务必重启 Apache,否则不生效
编写可落地的 RewriteRule 示例
规则不是越复杂越好,先跑通最简路径,再叠加逻辑。记住:RewriteEngine On 必须是第一行,[L] 标志通常不能少。
- 基础伪静态(内部映射,不跳转):
RewriteRule ^article/([0-9]+)\.html$ /article.php?id=$1 [L,NC]
访问 /article/123.html,实际执行 article.php?id=123,地址栏不变 - 永久重定向(SEO 迁移必备):
RewriteRule ^old-page\.html$ /new-page/ [R=301,L]
浏览器地址栏会跳变,搜索引擎会更新索引 - 屏蔽真实路径(常见于 PHP 框架):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
所有不存在的文件或目录请求,都交给 index.php 处理,但 css、js、图片等静态资源不受影响
调试与避坑要点
规则写错不会报错,只会“没反应”或“全404”,排查要讲方法。
- 先测试 RewriteEngine 是否开启:在 .htaccess 里只留 RewriteEngine On 和一条最简规则,比如重写一个固定字符串
- 检查日志:启用 RewriteLog(Apache 2.2)或 LogLevel alert rewrite:trace3(Apache 2.4),查看 error_log 中的匹配过程
- 避免循环:规则目标不要又触发自身,例如 RewriteRule ^(.*)$ $1/ 就会无限加斜杠
- 真实文件优先:务必用 !-f 和 !-d 排除静态资源,否则访不了 logo.png










