Apache 中 .htaccess 配置文件的生效范围

Apache 的配置文件可以简单分为系统级配置文件和目录级配置文件两类, 系统级配置文件是 Apache 启动或重新加载配置时,统一读取和解析系统级配置文件.

而目录级配置文件是系统级配置文件的一种补充机制,在 Apache 处理客户端请求时被加载和应用。


Apache 中的目录级配置文件叫作 .htaccess,它要生效需要满足两个前提:

  • 第一:需要在系统级配置文件中通过 Directory 指令块中配置 .htaccess 所在目录具备 AllowOverride 权限

  • 第二:客户端请求 URL 最终访问的文件需要位于 .htaccess 所在目录或其 子目录中


注意:

虽然 Apache 中 Directory 配置块决定了 .htaccess 是否生效,并且也是直接作用于磁盘文件系统路径,匹配的是真实的文件系统路径。

但 Directory 配置块也是受上下文限制的,意思就是若在虚拟主机中配置,不同虚拟主机间是不影响的。每个 VirtualHost 中的 Directory 配置只对该虚拟主机生效,即使两个虚拟主机指向同一个磁盘目录,它们的 AllowOverride 设置也是独立的。

*:80
    /home/ehigh/work/html → AllowOverride All

*:8000
    /home/ehigh/work/html/SXGeneralSystemFE/dist → AllowOverride All

假设客户端请求URL:http://10.0.28.22:8000/index.html ,请求的资源文件位于 /home/ehigh/work/html/ 的子目录下,虽然.htaccess 的生效范围是 .htaccess 所在目录及其子目录。

因为请求是在 8000 端口对应的虚拟主机中处理的,所以 80 端口对应虚拟主机中 Directory 配置块不会生效,此时即使 /home/ehigh/work/html/.htaccess 存在也不会生效。


Apache 处理请求的基本过程是这样的:

HTTP 请求
   ↓
匹配 VirtualHost
   ↓
URL → 文件系统路径
   ↓
匹配 <Directory>
   ↓
判断 AllowOverride
   ↓
读取允许范围内的 .htaccess
   ↓
合并配置并处理请求

先通过 请求的 IP、端口 和 Host 头 匹配对应的虚拟主机,然后根据 DocumentRoot 指定的根目录,将 请求URL 中对应的资源文件映射到服务器文件系统对应路径。

Directory 指令块的配置的 AllowOverride 权限,决定若 .htaccess 存在,是否读取应用,最后根据最终合并的配置(Directory + .htaccess)决定是否允许访问、是否进行重写等,


假设某个虚拟主机配置如下:

<VirtualHost *:8000>
    DocumentRoot /home/ehigh/work/html/SXGeneralSystemFE/dist

    <Directory /home/ehigh/work/html/SXGeneralSystemFE/dist>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Apache 处理请求 http://127.0.0.1:8000/index.html 的过程如下:

1、匹配虚拟主机:Apache 根据请求的 IP、端口(8000)和 Host 头(127.0.0.1),在配置中匹配到对应的 <VirtualHost *:8000> 块

2、路径映射:将 URL 中的路径 /index.html 映射到 DocumentRoot 指定的目录下

3、因为该目录被 Directory 指令块匹配,其中 AllowOverride All 允许 .htaccess 文件中的指令生效。

4、Apache 会检查 index.html 所在目录及其父目录(直到 DocumentRoot)中是否存在 .htaccess 文件,并加载其中允许的配置

5、根据最终合并的配置(Directory + .htaccess)决定是否允许访问、是否进行重写等,

posted on 2026-08-26 16:01  一直小爪子  阅读(5)  评论(0)    收藏  举报