Apache核心(Core)指令和区别

<Directory>和<Location>指令都是Apache配置文件httpd.conf中的常见指令,它们都能对其指定的作用域进行访问控制,区别在于<Directory>针对的是文件系统,而<Location>针对的是网络空间。

 

文件系统是指服务器所在机器上的所能看见的磁盘系统中的目录,比如Linux下的/usr/local/apache,或Windows系统中的C:/Program Files/Apache。<Directory>指令可以对真实存在于文件系统中的目录及其子目录进行访问控制,具体能进行怎样粒度的访控可以参考Apache手册的<Directory>使用说明。比如apache的DocumentRoot配置成/usr/local/www,该目录中有一个网页文件index.htm,那么以下配置代码就能阻止任何人访问www目录。
<Directory /user/local/www>
Order allow,deny
Deny from all
</Directory>
此时,如果用http://yourdomain.com/index.htm来请求index.htm文件时,Apache就会根据以上配置信息拒绝所有外来请求。这里仅仅举个例子,在实际应用中,以上配置可能没什么意义。

 

网络空间是指网站被服务器发送或者呈现在浏览器中的视图,例如有一个网页地址http://yourdomain.com/test1/index.htm,通过映射的方法,它的实际存储位置可以在服务器的/usr/local/www/test2/目录中,这个时候,想要对/test1这个网络路径进行访问控制,那么就可以配置<Location>属性。还有一种应用情况,现在很多网页是通过数据库信息动态生成的,或者用velocity这类模板引擎渲染而来,这样生成的看似静态的网页实际上并没有真实存在于服务器的文件系统中,因此对这类地址如果用<Directory>指令就无法达到期望的访问控制效果,就是说配<Directory>是不起作用的,而用<Location>指令就能达到目的。例如:
<Location /test1>
Order allow,deny
Deny from all
</Location>

以上配置能将所有发向http://yourdomain.com/test1/*的请求都拒绝。同<Directory>一样,具体能在<Location>指令中做怎样粒度的权限控制可以参考Apache手册的<Location>使用说明。

 

除此之外,Apache对于httpd.conf文件中<Directory>和<Location>(以及<Files>、<VirtualHost>)和它们各自的正则表达式版本(<DirectoryMatch>、<FilesMatch>、<LocationMatch>等)有指定的合并顺序,因此一个配置段的指令可能会被后边的配置段指令比如覆盖。这里有几个例子可以很好的说明这个情况,例如:
<Location />
Order deny,allow
Allow from all
</Location>

# 这个<Directory>段将不会实际生效
<Directory />
Order allow,deny
Allow from all
Deny from badguy.example.com
</Directory>
由于合并时处理<Directory>在先,处理<Location>在后,因此上面<Directory>配置里的Deny from badguy.example.com会被<Location>覆盖掉,这是配置httpd.conf时要注意的地方。

 

还有一点,改过Apache的httpd.conf配置文件后,必须重启Apache服务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*