需要注意的是,httpd采用的pcre库提供的perl兼容正则。以下是官方手册提供的一个示例,使用的命名捕获语法,它将匹配/var/www/combined/目录下的一级子目录,但不进行递归。将每个匹配到的结果保存到命名的分组sitename中,并通过环境变量"MATCH_capturename"进行引用,其中capturename必须转为大写字母,因为它就是这样赋值的。
<DirectoryMatch "^/var/www/combined/(?<sitename>[^/]+)"> Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example </DirectoryMatch>目前已经不能使用未命名的后向引用,例如$0,$1...。在URL重写时,正则语法至关重要,像grep/sed/awk中天然支持的基础正则和扩展正则语法虽然能解决大部分问题,但想要实现复杂的需求,只能使用语义丰富、完整的正则,如pcre提供的正则。
1.3.2 容器< Location >该容器和< Directory >、< Files >容器差不多,都是对满足匹配条件的路径封装一组指令,这些指令只生效于这些能匹配的路径。但是< Location >和< Directory >、< Files >最大的区别是:前者匹配的目标是WebSpace,即匹配URL中的路径,而后两者匹配的是本地文件系统的路径。
例如,当设置下面的location容器时,将匹配。
<Location "/newdir"> ...... </Location>location支持三种匹配模式:
精确匹配:location的模式和URL中的路径部分精确对应。
加尾随斜线:location的模式中加了尾随斜线时,将匹配该目录里面的内容。
无尾随斜线:location的模式中没有尾随斜线时,将匹配该目录和目录里面的内容。
例如,下面两个容器,第一个将匹配/private1、/private1/和/private1/file.txt,但不能匹配/private1other,而第二个将匹配/private2/和/private2/file.txt,但不能匹配/private2和/private2other。
<Location "/private1"> ...... </Location> <Location "/private2/"> ...... </Location>location和sethandler指令一起使用时很方便。例如,开启状态信息页面:
<Location "/server-status"> SetHandler server-status Require all granted </Location>同样,除了支持"*"、"?"、"[]"的通配符匹配,还支持"~"和LocationMatch指令的正则匹配。方法见上面的< Directory >容器。
1.3.3 < IfDefine >、< IfModule >和< IfVersion >条件判断这三个容器都是条件判断容器,且都只在httpd启动时进行判断,判断为真,则封装在其内的指令生效,否则忽略。且都可以在条件前加一个"!"以实现条件的否定,而且都可以嵌套以实现更复杂的配置。
< IfModule >容器是指当启动时加载了某模块时,该容器内的指令生效。可以是静态加载的模块,或者使用LoadModule指令加载的,但如果这样的话,加载对应模块的LoadModule指令必须在< IfModule >指令之前。例如:
LoadModule status_module modules/mod_status.so <IfModule "status_module"> <Location "/server-status"> SetHandler server-status Require all granted </Location> </IfModule>< IfDefine param >容器用于判断参数param是否已经定义,如果定义了,则条件为真,封装在其内的指令生效,否则忽略。加上感叹号则表示取反,例如< IfDefine !param >。
那么如何定义参数呢?有两种方法:使用httpd命令的"-D"选项;使用Define指令。
例如,在使用httpd启动时,加上一个"-D"选项定义MyName参数。
httpd -DMyName ......或者在配置文件中使用Define指令进行定义,但必须在< IfDefine >容器之前定义。例如:
Define MyName< IfDefine >可以进行嵌套。例如下面是官方的一个示例:
httpd -DReverseProxy -DUseCache -DMemCache ... <IfDefine ReverseProxy> LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so <IfDefine UseCache> LoadModule cache_module modules/mod_cache.so <IfDefine MemCache> LoadModule mem_cache_module modules/mod_mem_cache.so </IfDefine> <IfDefine !MemCache> LoadModule cache_disk_module modules/mod_cache_disk.so </IfDefine> </IfDefine> </IfDefine>