mod_rewrite在虚拟主机中按作用域独立生效,必须在<VirtualHost>内的<Directory>块中完整配置:启用引擎、设置Options+FollowSymLinks、AllowOverride权限,并用相对路径书写规则,不加开头斜杠。

Apache 中 mod_rewrite 不能“覆盖”全局策略,而是**按作用域独立生效**——虚拟主机内的规则完全不继承主配置或其它站点的重写逻辑。想让某虚拟主机按自己方式处理 URL,必须在它的 <VirtualHost> 内完整定义,包括启用引擎、设置权限、写明规则。
必须在 VirtualHost 的 Directory 块中启用并配置
只在 <VirtualHost> 根层级写 RewriteEngine On 是无效的。Apache 要求重写指令必须包裹在 <Directory> 块内,并配齐基础权限:
-
Options +FollowSymLinks:多数规则依赖此项,缺失会导致 500 错误 -
AllowOverride None(若直接写规则)或AllowOverride All(若同时用 .htaccess) -
RewriteEngine On必须紧贴规则前,且每个<VirtualHost>都要单独写
路径匹配写法要准确:不加开头斜杠
规则中的 Pattern 是相对于目录路径的,不是绝对 URL 路径。例如想匹配 https://site.com/article/123,应写:
RewriteRule ^article/([0-9]+)$ /article.php?id= [L]
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
而不是 ^/article/...。开头的 / 在 VirtualHost 的 Directory 环境下会被忽略或导致匹配失败。
避免与全局或 .htaccess 规则冲突
如果主配置里已启用 rewrite 或设置了全局 RewriteRule,它们对当前虚拟主机**完全不起作用**——但要注意两点:
- 不要在同一个目录下既在
<Directory>里写规则,又放 .htaccess;容易重复执行或优先级混乱 - 若需排除真实文件和目录(如 SPA 场景),必须显式加上条件:
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d
推荐的最小可用结构(直接嵌入 VirtualHost)
以下为生产环境常用写法,清晰、隔离、无冗余:
<VirtualHost *:80><br> ServerName example.com<br> DocumentRoot /var/www/example<br><br> <Directory "/var/www/example"><br> Options +FollowSymLinks<br> AllowOverride None<br> Require all granted<br> RewriteEngine On<br> RewriteRule ^article/([0-9]+)$ /article.php?id=$1 [L]<br> RewriteRule ^product/([^/]+)/?$ /product.php?slug=$1 [L,QSA]<br> </Directory><br></VirtualHost>
这样,该站点的重写行为就完全由自身控制,不干扰其他虚拟主机,也不受全局配置影响。

















