Apache服务器运维笔记(3)----容器部分
1.<IfModule>容器
<IfModule>容器作用于模块,它会首先判断模块是否载入,然后再决定是否进行处理,也就是说只有当判断结果为真时才会执行容器内的指令,相反如果为假,则会全部忽略。可以使用<IfModule 模块名> 或 <IfModule !模块名> 来判断模块是否载入。例如:
(1) <IfModule !mpm_netware_module> (2) <IfModule mpm_netware_module>
在第一种情况下,<IfModule> 容器会判断,如果载入了 mpm_netware_module 模块则不执行容器内的指令。第二种情况下,当 mpm_netware_module 被载入则执行容器内的指令,来看下面的例子:
<IfModule dir_module>
DirectoryIndex index.hmtl
</IfModule>
在这个例子中,<IfModule>会判断 dir_module 是否载入,如果载入则会执行 DirectoryIndex index.html 指令。
<IfModule !mpm_netware_module>
<IfModule !mpm_winnt_module>
User daemon
Group daemon
</IfModule>
</IfModule>
在上面的例子中,<IfModule>容器会首先判断 mpm_netware_module 模块是否载入,如果没有载入,会继续执行容器的下一条,判断 mpm_winnt_module 模块是否载入,当 mpm_winnt_module 也没有载入时,<IfModule> 容器内的 user 与 group 指令就会被执行。
2.<IfDefine>容器
<IfDefine>容器与<IfModule>容器类似,都是对条件进行判断,只不过<IfDefine> 容器只有当条件判断为真时才会执行,而且它还需要在 httpd 启动时加上特定的参数才能起作用。
(i)
<IfDefine Proxy> LoadModule proxy_module modules/libproxy.so </IfDefine>
要向是上述命令生效,启动 httpd 时的语句应该如下所示:
# httpd -D Proxy
(ii)
<IfDefine !Proxy> LoadModule proxy_module modules/libproxy.so </IfDefine>
# httpd -D Proxy
在这个例子中,<IfDefine !Proxy> 容器中的 !Proxy 与之前相比多了一个 “!”,于是它与之前的例子完全相反,<IfDefine !Proxy> 容器内的设置会被忽略掉。
3. <Directory> 与 <DirectoryMatch> 容器
<Directory>容器的作用就是让它所封装的指令在指定的目录以及它的子目录中起作用,这个目录必须是一个完整的路径,当然也可以使用通配符 "*"、"?" 匹配目录,也可以使用 "[]" 来确定字符范围,不过无论是"*"、"?" , 还是 "[]" 都不能匹配 "/",例如,<Directory /srv/*/html/index.html> 不能匹配 <Directory /srv/*/index.html>,而只能匹配<Directory /srv/apache/html/index.html> 或是 <Directory /srv/username/html/index.html> 。
<Directory /srv/apache/html/>
Order Deny,Allow
Deny from All
</Directory>
在上面的例子中,禁止了对 /srv/apache/html/ 目录的访问权限,任何请求到 /srv/apache/html/ 的链接都会被拒绝。
除了上面所提到的通配符和"[]" 之外,还可以通过在正则表达式的前面加上"~" 来使用正则表达式进行匹配,例如:
<Directory ~"^/srv/apache[0-9]{2}/html/"> Order Deny,Allow Allow from All </Directory>
在上面的例子中,通过使用正则表达式来匹配 /srv/ 下所有以 apache 开头以0至9结尾的两位数字的目录下的 /html/ 目录并允许这些目录被任何用户访问,这个容器的URL请求类似于下面的链接:
http://www.sitename.com/srv/apache00/html http://www.sitename.com/srv/apache01/html .............................................. .............................................. http://www.sitename.com/srv/apache99/html
<DirectoryMatch> 容器与 <Directory> 容器的作用相似,都是作用于目录,只是 <DirectoryMatch>容器可以直接接受正则表达式,而无须加上"~",例如:
<DirectoryMatch "^/srv/apache[0-9]{2}/html/"> Order Deny,Allow Allow from All </DirectoryMatch>
4. <Files> 与 <FilesMatch> 容器
与<Directory>容器作用于目录相对应,<Files>容器只作用于文件,和<Directory>容器一样,也可以使用通配符和"[]" 以及在正则表达式的前面加上"~" 来使用正则表达式进行文件匹配。例如,匹配所有的以 .html 后缀结尾的文件并允许所有用户访问:
<Files "^\.html"> Order Deny,Allow Allow from All </Files>
<FilesMatch>容器与<Files>容器类似,只是它除了有<Files>容器的功能外,还能直接使用正则表达式来进行匹配。
<FilesMatch "\.(gif|jpe?g|png)$"> Order Deny,Allow Allow from All </FilesMatch>
5. <Location>与<LocationMatch>容器
<Location>与<LocationMatch>容器的作用是对URL进行访问控制。
例如:
<Location /cgi>
Order Allow,Deny
Deny from All
</Location>
在上面的例子中,<Location>容器会首先对到来的URL请求进行匹配,如果是以 /cgi 开头的URL则会全部拒绝,例如:
http://www.sitename.com/cgi http://www.sitename.com/cgi-bin http://www.sitename.com/cgi/www/index.html
除此之外,还可以通过<Location>容器将URL请求映射到Apache模块处理器上,例如,使用Apache自带的 mod_status 模块:
<Location /server-status> SetHandler server-status </Location>
如果使用上面的容器来设置,那么访问 http://www.sitename.com/server-status时,Apache会将链接交给 mod_status 模块处理,并返回一个Apache服务器运行状态页面。