apache虚拟主机的rewrite规则不自动继承,须在每个virtualhost的directory块内单独启用并配置;需启用mod_rewrite模块,设置options +followsymlinks和allowoverride none,路径匹配用^article/而非^/article/,并添加[l]等标志确保正确执行。

Apache 虚拟主机的 Rewrite 规则不能自动继承,每个站点必须单独开启、独立写规则、明确作用范围——否则规则不生效或相互干扰。
确保 mod_rewrite 模块已启用
这是所有重写的前提。检查主配置中是否加载模块:
- Linux(Debian/Ubuntu):运行 sudo a2enmod rewrite && sudo systemctl restart apache2
- Linux(CentOS/RHEL):确认 /etc/httpd/conf.modules.d/00-base.conf 包含未注释的 LoadModule rewrite_module modules/mod_rewrite.so
- Windows(WAMP/XAMPP):打开 httpd.conf,取消该行前的 #
在 VirtualHost 的 Directory 块内配置
不能只在
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Options +FollowSymLinks:多数规则依赖此项,否则报 500 错误
- AllowOverride All:允许 .htaccess 覆盖(若直接写规则可设为 None)
- RewriteEngine On 必须紧贴规则前,且每台虚拟主机都要写
- 路径匹配用 ^article/(无开头斜杠),不是 ^/article/;末尾加 [L] 防止后续规则误触发
避免常见冲突和误用
多站点共存时,这些细节决定规则是否稳定可靠:
- 条件判断(RewriteCond)仅对紧随其后的那条 RewriteRule 生效,不能跨行复用
- 不要同时在
和同目录下 .htaccess 写规则,易重复执行或优先级混乱 - 需排除真实文件/目录时,加上:RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteCond %{REQUEST_FILENAME} !-d
- 如需保留原查询参数,加 [QSA];如需外部跳转,加 [R=301,L]
推荐写法示例(直接嵌入 VirtualHost)
以下为生产环境常用结构,清晰、安全、无冗余:
<virtualhost>
ServerName example.com
DocumentRoot "/var/www/example"
<directory>
Options +FollowSymLinks
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^article/(\d+)$ /article.php?id=$1 [QSA,L]
RewriteRule ^product/([^/]+)/([0-9]{4})$ /product.php?brand=$1&year=$2 [QSA,L]
</directory></virtualhost>
规则集中、无需 .htaccess、重启后立即生效,适合性能敏感场景。










