apache配置<Files> <FilesMatch> &

时间:2016-04-05

<Files> 指令

说明        包含作用于匹配指定文件名的指令
语法        <Files filename> ... </Files>
作用域        server config, virtual host, directory, .htaccess
覆盖项        All
状态        核心(C)
模块        core

<Files>指令提供了基于文件名的访问控制,类似于<Directory>和<Location>指令。它将配对一个</Files>指令。在此配置段中定义的指令将作用于其基本名称(不是完整的路径)与指定的文件名相符的对象。<Files>段将根据它们在配置文件中出现的顺序被处理:在<Directory>段和.htaccess文件被处理之后,但在<Location>段之前。请注意:<Files>能嵌入到<Directory>段中以限制它们作用的文件系统范围。

filename参数应当是一个文件名或是一个包含通配符的字符串,其中"?"匹配任何单个字符,"*"匹配任何字符串序列。在"~"字符之后同样可以使用正则表达式。比如:

<Files ~ "\.(gif|jpe?g|png)$">

将匹配绝大部分常见的因特网图象格式。然而在Apache1.3及其后继版本中,更推荐使用<FilesMatch>指令。

请注意与<Directory>和<Location>配置段不同的是:<Files>配置段可用于.htaccess文件当中。这将允许用户在文件层面上控制对它们自己文件的访问。 

<FilesMatch> 指令

说明        包含作用于与正则表达式匹配的文件名的指令
语法        <FilesMatch regex> ... </FilesMatch>
作用域        server config, virtual host, directory, .htaccess
覆盖项        All
状态        核心(C)
模块        core

<FilesMatch>指令就像<Files>指令一样提供了针对文件名的访问控制。然而,它使用的是正则表达式。比如说:

<FilesMatch "\.(gif|jpe?g|png)$">

将匹配最常见的internet图形文件格式。 

Include 指令

说明        在服务器配置文件中包含其它配置文件
语法        Include file-path|directory-path
作用域        server config, virtual host, directory
状态        核心(C)
模块        core
兼容性        通配符仅在Apache 2.0.41 及以后的版本中可用

这个指令允许在服务器配置文件中加入其它配置文件。

Shell风格(fnmatch())的通配符可以用于按照字母顺序一次包含多个文件。另外,如果Include指向了一个目录而不是一个文件,Apache将读入该目录及其子目录下的所有文件,并依照字母顺序将这些文件作为配置文件进行解析。但是并不推荐这么做,因为偶尔会有临时文件在这个目录中生成,从而导致httpd启动失败。

文件的路径可以是一个完整的绝对路径(以一个斜杠开头):

Include /usr/local/apache2/conf/ssl.conf
Include /usr/local/apache2/conf/vhosts/*.conf

或是相对于ServerRoot目录的相对路径:

Include conf/ssl.conf
Include conf/vhosts/*.conf

请确保包含的目录中不包含任何诸如编辑器临时文件等引起误导的文件,因为Apache会尝试读取它们并把其中的内容作为配置指令来处理,这样可能会导致启动过程的失败。运行apachectl configtest 将会把配置检查时所使用的所有文件列出来以供参考。这将有助于检验配置中是否仅包含了您所希望出现那些文件。

root@host# apachectl configtest
Processing config file: /usr/local/apache2/conf/ssl.conf
Processing config file: /usr/local/apache2/conf/vhosts/vhost1.conf
Processing config file: /usr/local/apache2/conf/vhosts/vhost2.conf
Syntax OK 

<Location> 指令

说明        将封装的指令作用于匹配的URL
语法        <Location URL-path|URL> ... </Location>
作用域        server config, virtual host
状态        核心(C)
模块        core

<Location>提供了基于URL的访问控制。与<Directory>指令类似,它也会启用一个以</Location>结尾的配置段。<Location>配置段的处理位于<Directory>, .htaccess, <Files>之后,并依照在配置文件中出现的顺序进行处理。

<Location>配置段完全独立于文件系统之外操作。这有几个重要的后果。最重要的是<Location>不能用于针对文件系统的访问控制。因为可能会有几个不同的URL指向文件系统中的同一个文件,所以这样的控制常常会被很容易的绕过。
何时使用<Location>?

使用<Location>来将指令应用于独立于文件系统之外的内容。文件系统之内的内容请使用<Directory>和<Files>指令。不过一个例外是<Location /> ,它可以方便的作用于所用URL。

对所有的原始(非代理)请求来说,匹配的URL应该是具有"/path/"形式的URL路径。不包括访问方法、主机名、端口或查询字符串等。对于代理的请求,匹配的URL必须为"scheme://servername/path"的形式,而且必须包括前缀。

URL可以用一个通配符字符串来进行通配符的处理。"?"匹配任何单个的字符,而"*"匹配所有字符序列。

也可以附加"~"字符来表示使用正则表达式。例如:

<Location ~ "/(extra|special)/data">

将匹配所有包含字符串"/extra/data"或"/special/data"的URL。在Apache1.3及其后续版本中,加入了一个新的推荐使用的<LocationMatch>指令,其功能与<Location>的正则表达式版本相同。

<Location>的功能在与SetHandler指令联用时能发挥最大效能。比如启用状态请求,但仅对来自foo.com的用户起效,您可以这样使用:

<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
</Location>
请注意"/"(斜线)

斜线字符根据它在URL中出现的位置不同有着特殊的意义。大家可能都已经习惯在文件系统中,多个连续的斜线会被作为单一的斜线处理(例如"/home ///foo"与"/home/foo"相同)。但在URL里面,这样是行不通的。<LocationMatch>指令和正则表达式版本的<Location>要求您明确使用多重斜线。比如:<LocationMatch ^/abc>将匹配请求"/abc"但不会匹配请求"//abc"。而非正则表达式版本的<Location>指令在用于代理请求时,也有类似表现。但当非正则表达式版本的<Location>作用于非代理请求时,它会将多个毗邻的斜线认作单个斜线。比如,如果您指定了<Location /abc/def>而请求是指向"/abc//def"的,那么它们就是匹配的。 

<LocationMatch> 指令

说明        将封装的指令作用于正则表达式匹配的URL
语法        <LocationMatch regex> ... </LocationMatch>
作用域        server config, virtual host
状态        核心(C)
模块        core

<LocationMatch>和<Location>指令相同,提供了基于URL的访问控制。但它使用正则表达式作为参数,而不是简单字符串。比如:

<LocationMatch "/(extra|special)/data">

将匹配包含子串"/extra/data"或"/special/data"的URL。

上一条:配置Apache及实现多站点 下一条:Apache Hadoop最佳实践和反模式

相关文章

最新文章