apache的.htaccess文件需同时满足加载mod_rewrite模块和设置allowoverride all两个前提才生效;其作用范围为所在目录及子目录,后读取的同名指令会覆盖先读取的;验证方法是用directoryindex测试首页是否切换。

Apache 的 .htaccess 文件不是默认就生效的,必须手动开启支持,且它的作用范围和执行优先级有明确规则。启用不等于可用,配置生效还取决于模块加载、目录权限、语法位置等多个环节。
一、启用 .htaccess 的两个硬性前提
缺一不可,否则文件被完全忽略:
-
加载 mod_rewrite 模块:在
httpd.conf(Linux 常见路径为/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf)中确认存在且未被注释的行:LoadModule rewrite_module modules/mod_rewrite.so -
设置 AllowOverride All:找到对应网站目录的
<directory></directory>区块(如<directory></directory>),确保包含:AllowOverride All
若仅写AllowOverride None或留空,默认禁用;FileInfo、AuthConfig等细粒度值仅开放部分功能,不支持重写或错误页等全部指令。
二、.htaccess 的实际生效路径与优先级
Apache 按照从根到子的顺序逐层读取 .htaccess,后读取的规则会覆盖先读取的同类型指令(非追加):
- 请求 URL 为
/blog/post/123.html时,Apache 依次检查:/→/blog/→/blog/post/目录下的 .htaccess - 若
/blog/.htaccess中设了ErrorDocument 404 /blog/404.html,而/blog/post/.htaccess中又写了ErrorDocument 404 /404-main.html,则访问/blog/post/missing.php会触发后者定义的页面 - 重写规则(
RewriteRule)按文件内顺序执行,[L]标志会终止当前文件后续规则,但不阻止上级目录 .htaccess 中的规则继续参与匹配(除非用[END])
三、验证是否真正启用的三步实操法
光改配置不等于成功,需逐层验证:
- 在网站根目录新建
.htaccess,内容仅一行:DirectoryIndex test.html index.php - 在同目录下创建一个空白的
test.html文件 - 访问域名首页,若显示
test.html内容(而非index.php),说明AllowOverride生效且mod_rewrite加载无误;若报 500 错误,则可能是语法错误或模块未启用
四、常见陷阱与绕过方案
很多问题看似是 .htaccess 失效,实则是环境限制:
-
共享主机限制:部分托管服务商禁止
AllowOverride All,只允许AllowOverride FileInfo。此时无法使用AuthType或Require类指令,但ErrorDocument和基础RewriteRule仍可用 -
文件名与权限问题:必须命名为
.htaccess(开头带点,无扩展名);上传后运行chmod 644 .htaccess,避免因权限过高(如 777)被 Apache 主动拒读 -
缓存干扰:浏览器或代理可能缓存旧的 404/500 响应,测试时用隐身窗口或加随机参数(如
?t=123)排除干扰











