每个虚拟主机必须显式启用RewriteEngine且不继承全局配置:1.确保mod_rewrite已加载;2.在内的块中设Options +FollowSymLinks、AllowOverride All,并写RewriteEngine On及规则;3.规则路径匹配用^article/而非^/article/,末尾加[L],条件用RewriteCond前置。
在 apache 虚拟主机中配置独立的 rewriteengine,关键在于**每个虚拟主机必须显式启用重写引擎、独立定义规则,且不依赖全局继承**。rewrite 功能默认不继承,即使主配置开了 rewriteengine on,虚拟主机里也得自己开。
1. 确保 mod_rewrite 模块已加载
检查 httpd.conf(或对应模块配置文件)中这行未被注释:
LoadModule rewrite_module modules/mod_rewrite.so
若使用 Debian/Ubuntu,可直接运行:sudo a2enmod rewrite && sudo systemctl restart apache2
CentOS/RHEL 则确认 /etc/httpd/conf.modules.d/00-base.conf 包含该行,再重启 httpd。
2. 在 VirtualHost 的 Directory 块中启用并配置重写
不能只在 根层级写 RewriteEngine On —— 必须包裹在 段内,且该目录需有执行权限:
- 设置
AllowOverride All(允许 .htaccess 覆盖)或直接在内写规则 - 加上
Options +FollowSymLinks(多数 RewriteRule 需要此选项) -
RewriteEngine On必须出现在内,且紧贴规则之前
示例(适用于域名 site-a.example.com):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName site-a.example.com
DocumentRoot "/var/www/site-a"
<directory>
Options +FollowSymLinks
AllowOverride All
Require all granted
RewriteEngine On
RewriteRule ^article/(\d+)$ /article.php?id=$1 [L]
RewriteRule ^about$ /pages/about.html [L]
</directory></virtualhost>
3. 避免常见冲突点
多个虚拟主机共存时,容易踩坑:
-
路径匹配前缀要明确:用
^/article/...可能失败(Apache 2.4 默认匹配的是 URI 路径,不含开头斜杠),推荐用^article/...(无开头 /) -
不要混用 .htaccess 和 Directory 规则:如果已在
中写了完整规则,就无需再放 .htaccess;否则可能重复执行或冲突 -
L 标志很重要:每条实际生效的规则末尾建议加
[L],防止后续规则误匹配 -
条件判断需前置:如需根据域名、用户代理等过滤,用
RewriteCond放在RewriteRule前,且仅对紧随其后的那条规则生效
4. 验证与调试技巧
启用后快速验证是否生效:
- 访问一个匹配规则的 URL(如
http://site-a.example.com/article/123),看是否正确跳转或内部重写 - 开启 Apache 重写日志(临时):
RewriteLogLevel 3RewriteLog "/var/log/apache2/rewrite.log"
(注意:Apache 2.4+ 已弃用该方式,改用RewriteOptions Inherit+ErrorLog级别为info并启用mod_rewrite日志模块) - 检查错误日志:
tail -f /var/log/apache2/error.log,常见报错如 “RewriteRule: cannot compile regular expression” 表示正则写错










