Apache重写功能需在<Directory>块内显式配置三项指令:Options +FollowSymLinks、AllowOverride All(或None)、RewriteEngine On;规则路径不带开头斜杠,且须用RewriteCond排除真实文件和目录;多站点需为每个<VirtualHost>单独配置。

Apache 的 Directory 配置块是启用重写功能的关键位置,必须显式设置才能让 Rewrite 规则生效。单纯开启 mod_rewrite 模块或写 RewriteEngine On 并不足够——规则只在被允许的目录范围内执行。
必须设置的三项核心指令
在对应站点的 <Directory> 块内(不是 <VirtualHost> 根层级),需同时配置以下内容:
-
Options +FollowSymLinks:多数 RewriteRule 依赖此项,缺失会导致 500 错误;若已启用
Options All,也需确认包含该选项 -
AllowOverride All:允许 .htaccess 文件覆盖服务器配置;若规则直接写在
<Directory>内,可设为None,但RewriteEngine和RewriteRule仍需在此块中声明 -
RewriteEngine On:必须紧贴规则前启用,每个
<Directory>独立作用,不能继承
路径匹配注意斜杠起始
在 <Directory> 内写的规则,其匹配路径以目录根为起点,不带开头斜杠:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ✅ 正确:
RewriteRule ^article/(\d+)\.html$ /index.php?id=$1 [L] - ❌ 错误:
RewriteRule ^/article/(\d+)\.html$ ...(开头斜杠会被忽略或导致匹配失败)
真实文件/目录需主动排除
避免重写干扰静态资源访问,建议在规则前加判断:
-
RewriteCond %{REQUEST_FILENAME} !-f(跳过已存在的文件) -
RewriteCond %{REQUEST_FILENAME} !-d(跳过已存在的目录) - 这两行应放在
RewriteRule前,且仅对紧随其后的那条规则生效
多站点务必独立配置
虚拟主机之间不共享 <Directory> 设置,每个站点都需单独写完整块:
- 不能只在主配置里启用模块,就以为所有站点自动支持重写
- 每个
<VirtualHost>下的<Directory>必须各自包含Options、AllowOverride和RewriteEngine - 否则规则可能完全不触发,或因权限不足返回 500/403

















