1)文件系统容器
和指令与其相应的正则表达式版本(和)一起作用于文件系统的特定部分。配置段中的指令作用于指定的文件系统目录及其所有子目录,.htaccess文件可以达到同样的效果。在下面的示例中,/var/web/dir1及其所有子目录被允许进行目录索引。
配置段中的指令作用于特定的文件名,而无论这个文件实际存在于哪个目录下。下面的示例中的配置指令如果出现在配置文件的主服务器段,则会拒绝对位于任何目录下的private.html的访问。
Order allow,deny Deny from all
|
和段的组合可以作用于文件系统中的特定文件。下面的示例中的配置会拒绝对/var/web/dir1/private.html、/var/web/dir1/subdir2/private.html、/var/web/dir1/subdir3/ private.html等任何/var/web/dir1/目录下的private.html的访问。
Order allow,deny Deny from all
|
2)网络空间容器
指令与其相应的正则表达式版本()一起作用于网络空间的特定部分。下面的示例中的配置会拒绝对任何以“/private”开头的URL路径的访问,如http://yoursite.example.com/private、http://yoursite.example.com/private123、http://yoursite.example. com/private/dir/file.html等所有以“/private”开头的URL路径。
Order Allow,Deny Deny from all
|
指令与文件系统无关,下面的示例演示了如何将特定的URL映射到Apache内部的处理器mod_status中,而并不要求文件系统中确实存在server-status文件。
3)通配符和正则表达式
<Directory>、<Files>、<Location>指令可以使用与C标准库中的fnmatch类似的shell风格的通配符。“*”匹配任何字符串,“?”匹配任何单个的字符,“[seq]”匹配seq序列中的任何字符,“/”符号不被任何通配符所匹配,所以必须显式地使用。
如果需要更复杂的匹配,这些容器都有一个对应的正则版本:<DirectoryMatch>、<FilesMatch>、<LocationMatch>,可以使用与Perl兼容的正则表达式,以提供更复杂的匹配。下面的示例使用非正则表达式的通配符来改变所有用户目录的配置。
<Directory /home/*/public_html>
Options Indexes
</Directory>
下例是使用正则表达式一次性拒绝对多种图形文件的访问。
<FilesMatch \.(?i:gif|jpe?g|png)$>
Order allow,deny
Deny from all
</FilesMatch>
4)选择文件系统容器,还是网络空间容器
选择使用文件系统容器,还是使用网络空间容器其实很简单。当指令作用于文件系统时,总是用<Directory>或<Files>;而当指令作用于不存在于文件系统中的对象时,就用<Location>,比如一个由数据库生成的网页。一定不要试图用<Location>去限制对文件系统中的对象的访问,因为许多不同的网络空间路径可能会映射到同一个文件系统目录,从而导致访问限制被突破。比如:
<Location /dir/>
Order allow,deny
Deny from all
</Location>
上述配置对http://yoursite.example.com/dir/请求的确起作用。但是,设想在一个不区分大小写的文件系统中,这个访问限制会被http://yoursite.example.com/DIR/请求轻易突破。而<Directory>指令才会真正作用于对这个位置的任何形式的请求。但是,有一个例外,就是UNIX文件系统中的符号连接(软连接),符号连接可以使同一个目录出现在文件系统中的多个位置。<Directory>指令将不重设路径名而直接追踪符号连接,因此,对于安全要求最高的,应该用Options指令禁止对符号连接的追踪。
同时,也不要认为使用大小写敏感的文件系统就无所谓了,因为有很多方法可以将不同的网络空间路径映射到同一个文件系统路径中,所以,应当尽可能使用文件系统容器。但是也有一个例外,就是把访问限制放在<Location />配置段中可以很安全地作用于除了某些特定URL以外的所有URL。
本文转自图书作者王达博客。
【责任编辑:
雪花 TEL:(010)68476606-8007】