Apache目录级重写需满足三条件:mod_rewrite启用、AllowOverride设为All或FileInfo、.htaccess语法正确且路径匹配不加前导斜杠;关键在<Directory>块中配置AllowOverride并重启服务。

Apache mod_rewrite 在目录级别生效,核心是让 .htaccess 文件里的规则被识别并执行。这不单是写几行正则的事,而是要打通“模块加载 → 权限放开 → 规则生效”这条链路。关键点在于:Apache 默认禁止目录级重写,必须显式授权,否则 .htaccess 里的 RewriteRule 全部静默失效。
目录级重写必须满足三个条件
-
mod_rewrite模块已启用(全局前提) - 对应目录的
AllowOverride设置为All(或至少包含FileInfo) -
.htaccess文件位于目标目录且语法正确(路径匹配不加开头斜杠/)
如何配置 AllowOverride(关键一步)
找到 Apache 的目录配置块(通常在 httpd.conf、apache2.conf 或虚拟主机配置如 000-default.conf 中),定位到类似这样的 <Directory> 区块:
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride None ← 这里必须改!
Require all granted
</Directory>把 AllowOverride None 改成:
-
AllowOverride All(最常用,允许所有覆盖类型) - 或更精细地写
AllowOverride FileInfo(仅允许重写、重定向等与 URL 处理相关的指令,更安全)
改完保存,重启 Apache:
- Ubuntu/Debian:
sudo systemctl restart apache2 - CentOS/RHEL:
sudo systemctl restart httpd
.htaccess 规则写法注意事项
放在网站根目录(如 /var/www/html/.htaccess)或子目录下,内容示例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteBase / # 若站点不在根路径,需设为实际路径,如 /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]注意:
-
RewriteRule的匹配模式用^article/,不是^/article/(目录级上下文自动去掉前导/) -
RewriteBase要和实际 URL 路径一致,否则相对路径替换会出错 -
[L]标志建议加上,避免后续规则干扰;[QSA]保留原查询参数
虚拟主机中特别提醒
每个 <VirtualHost> 必须单独配 <Directory> 块并设 AllowOverride,不能只在 <VirtualHost> 根层级写 RewriteEngine On。例如:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
<Directory /var/www/example>
Options +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>没这个 <Directory> 块,.htaccess 就是摆设。
不复杂但容易忽略

















