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)决定是否允许访问、是否进行重写等,
浙公网安备 33010602011771号