Apache服务器中使用配置段(容器)

admin  2016-07-10 20:29   Hits: 

配置文件中指令的作用范围可能是整个服务器,也可能是特定的目录,文件,主机,URL。容器有两种基本类型。大多数容器是针对各个请求的,包含于其中的指令仅对与该容器匹配的请求起作用,而容器<IfDefine><IfModule><IfVersion>仅在启动和重启中起作用。如果在启动时指定的条件成立,则其中的指令对所有的请求都有效,否则被忽略。
<IfDefine>容器中的指令只有在http命令行中设定了特定的参数才有效。下例中,只有在服务器用httpd-DClosedForNow方式启动时,所有的请求才会被重定向到另一站点
<IfDefine ClosedForNow>
    Redirect /http://otherserver.example.com/
</IfDefine>
<IfModule>容器中的指令只有当服务器启动特定的模块时才有效,配置文件中该模块的装载指令LoadModule行必须出现在此容器之前,这个容器应该仅用于你希望无论特定模块是否安装,配置文件都能正常运转,而不应该用于容器中的指令在任何情况下都无须生效的场合,因为它会抑制类似模块没找到之类的有用的出错信息。
<IfModule mod_mime_magic.c>
   MimeMagicFile conf/magic   #条件成立才使用MimeMagicFile conf/magic指令
</IfModule>
<IfVersion>当正在执行的服务器版本与制定的版本要求相符才有效,这个模块被设计用于测试套件,以及在一个存在多个不同httpd版本的大型网络中需要分别针对不同版本使用不同配置的情况。
<IfVersion>=2.1>
#仅在版本高于2.1才生效
</IfVersion>
最常用的配置段是针对文件系统和网络空间特定位置的配置段。首先必须理解文件系统和网络空间这两个概念的区别,文件系统是指操作系统所看见的磁盘视图,比如,在UNIX文件系统中,Apache会被默认安装到/usr/local/apache2,相反,网络空间是网站被web服务器发送,以及被客户在浏览器中所看到的视图,所以网络空间中的路径/dir/在Apache采用默认安装路径的情况下对应于UNIX文件系统中的路径/usr/local/apache2/htdocs/dir/,由于网页可从数据库或其他地方动态生成,因为网络空间无须直接映射到文件系统。
 
1、文件系统容器
<Directory>和<Files>指令与其相应的正则表达式版本<DirectoryMatch>和<FilesMatch>一起作用于文件系统的特点部分,<Directory>配置段中的指令作用于指定的文件系统目录及所有子目录,.htaccess文件可以达到同样的效果。下例中,/var/web/dir1及其所有子目录被允许进行目录索引
 
<Directory /var/web/dir1> #为目录/var/web/dir1设置属性
    Options +Indexs   #被设置的目录允许被索引
</Directory>#结束一个目录的设置
 
<Files>配置段中的指令作用于特定的文件名,而无论这个文件实际存在于哪个目录,下列中的配置指令如果出现在配置文件的主服务器段,则会拒绝对位于任何目录下的private.html的访问。
 
<Files private.html> #为任意目录下的private.html文件设置属性
Order allow,deny #顺序是先允许和拒绝
Deny from all #拒绝对于任何目录下的pribate.html的访问
</Files> #结束一个文件的设置
 
<Directory>和<Files>的组合可以作用于文件系统中的特定文件,在下面的示例中的配置会拒绝对/var/web/dir1/private.html文件 /var/web/dir1/subdir2/private.html文件 等任何/var/web/dir1/目录下的private.html文件的访问
 
<Directory /var/web/dir1> #为目录/var/web/dir1设置属性
    <Files private.html>#为目录/var/web/dir1及其子目录下的private.html文件设置属性
      Order allow,deny #顺序是先允许和拒绝
      Deny from all #拒绝对于任何目录下的pribate.html的访问
    </Files>
</Directory>#结束一个目录的设置
 
2、网络空间容器
<Location>指令与其相应的正则表达式版本<LocationMatch>一起作用于网络空间的特定部分,
<Location /private> #为以private开头的URL路径设置属性
   Order Allow,Deny 
   Deny from all
</Location>
 
3、通配符和正则表达式
<Directory><Files><Location>指令可以使用与C标准库中的fnmatch类似的shell风格的通配符。'*'匹配任何字符,'?'匹配单个字符,'[seq]'匹配seq序列中的任何字符,符号"/"不被任何通配符所匹配,所以必须显示的使用。
如果需要更复杂的匹配,这些容器都有一个对应的正则版本<DirectoryMatch>和<FilesMatch><LocationMatch>,可以使用与perl兼容的正则表达式,以提供更复杂的匹配,但是还必须注意下面配置段的合并部分关于使用正则表达式会如何作用于匹配指令的内容,下列使用非正则表达式的通配符来改变所有用户目录的配置:
 
<Directory /home/*/public_html> #使用非正则表达式的通配符来改变所有用户目录的配置
    Options +Indexs   #被设置的目录允许被索引
</Directory>#结束一个目录的设置
 
下列使用正则表达式一次拒绝多种图形文件的访问
<FileMatch \.(?i:gif|jpe?g|png)$>
   Order Allow,Deny 
   Deny from all
</FileMatch>
 
4、如何选择使用容器
选择使用文件系统容器还是使用网络空间容器其实很简单,当指令应该作用于文件系统时,总是用<Directory><Files>,而指令作用于不存在于文件系统的对象时,就用<Location>
上一篇:附加配置文件httpd-mpm.conf中的全局参数
下一篇:.htaccess文件和访问限制