Apache中DocumentRoot和Directory的区别

时间:2021-04-20 09:11:56 类型:WEB服务器
字号:    

  在一段Apache配置中往往会出现一对令人疑惑的值,DocumentRoot和Directory,原因在于它们后面跟了一样的路径。

  一.虚拟主机

  以一段vhost(虚拟主机)的配置为例。该配置由软件自动生成,由于它可以正常运行,我们从这里入手。

  
  <VirtualHost *:80>
    DocumentRoot "E:\www\public"     --①
    ServerName www.test.com
    ServerAlias 
  <Directory "E:\www\public">        --②
      Options FollowSymLinks ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      Require all granted
  </Directory>
</VirtualHost>
  

  ①DocumentRoot代表根目录

  ②代表该目录的基本属性

  可以看到的一个现象是:①②目录一致,且该路径下一般都有index.php入口文件。

  二.服务器配置

  httpd.conf一般用于配置Apache的主体依赖环境。在其中有一段配置定义:

#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other 
# <Directory> blocks below.
#
DocumentRoot  "D:\phpStudy\WWW"
<Directory />
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

  注意到包含关系,即主体配置中会包含虚拟主机标签,可以推测出虚拟主机的设置是在全局主体配置的基础上进行增量定义的。

  httpd.apache.org/docs/2.4/mod/core.html#directory

  在Apache的官方文档中给出了Directory标签的说明:定义该目录、及子目录的配置属性。

  有意思的是各个属性配置项的含义,如下:

  

 Options:复写选项策略,可选值有Indexes、FollowSymLinks和ExecCGI等。

     分别代表"允许列举目录"、"允许Directory路径定义以外的链接文件"、"允许执行CGI程序"。

  AllowOverride:复写重定向策略

  Order:复写可用指令集

  Allow:复写可访问网站的地址集


  三.对比结论

  实际上明白各种语法的含义后,至此答案已经明了。

  DocumentRoot属性用于指定了一种URL映射的根目录路径。例如http://localhost/

  而Directory标签是为了指定URL路径在后续的请求中可以进行操作的权限范围属性。

  注意到二的一段黑字,我们将有可能把一的①②路径写得不一致,即DocumentRoot为子目录,Directory为父目录。

<VirtualHost *:80>
    DocumentRoot "E:\www\public"
    ServerName test.com
    ServerAlias 
  <Directory "E:\www">
      Options -Indexes -FollowSymLinks +ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
     Require all granted
  </Directory>
</VirtualHost>

  在此配置文件中指定了不允许列举目录、禁止PHP程序访问Directory路径定义以外的链接文件、允许执行CGI程序、对根目录授予了允许所有访问都接受的权限。

  由于根目录(DocumentRoot)的路径是目录访问定义(Directory)的一个子目录,理应也能正常运行。

  在E:\www\public下新建一个index.php文件,echo "Hello World"。

  启动httpd.exe后一切正常


<