Apache URL重写必须分三步:启用mod_rewrite模块、配置AllowOverride All授权.htaccess、编写含RewriteEngine On和[L]标记的正确规则,缺一不可。

第一步:确认 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前的# - 验证是否成功:运行
httpd -M | grep rewrite或apache2ctl -M | grep rewrite,看到rewrite_module (shared)才算到位
第二步:允许 .htaccess 使用重写指令
即使模块开了,Apache 默认禁止目录级重写。必须显式授权:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 找到对应虚拟主机或主配置中的
<Directory>区块(常见路径如/etc/apache2/sites-available/000-default.conf或/etc/httpd/conf/httpd.conf) - 把
AllowOverride None改成AllowOverride All - 建议同时确保
Options包含FollowSymLinks(部分旧版本必需) - 改完必须重启 Apache:
sudo systemctl restart apache2或sudo apachectl restart
第三步:写一条能跑通的 RewriteRule
规则不是越长越好,先从最简路径开始测试。记住两个关键点:开头必须有 RewriteEngine On,结尾通常要加 [L]。
- 在网站根目录创建或编辑
.htaccess文件 - 写入基础伪静态示例(内部映射,不跳转):
RewriteEngine On<br>RewriteRule ^article/([0-9]+)\.html$ /article.php?id=$1 [L,NC]
访问/article/123.html时,实际执行article.php?id=123,地址栏不变 - 若需永久重定向(比如 SEO 迁移),用
[R=301,L]:RewriteRule ^old-page\.html$ /new-page/ [R=301,L] - 转发时保留查询参数?加
[QSA],例如:RewriteRule ^receiver\.php$ /otherfolder/receiver.php [QSA,L]
避坑提醒
规则写错不会报错,只会“没反应”或全站 404。排查建议:
- 先删掉其他规则,只留
RewriteEngine On和一条最简规则,比如重写一个固定路径 - 检查 Apache 错误日志(
error_log),Apache 2.4 可临时加LogLevel alert rewrite:trace3查匹配过程 - 切记:不要在内部转发场景误用
[R]—— 它会触发真实跳转,POST 数据丢失,地址栏变,完全违背“无缝转发”初衷

















