apache配置 <Directory> 指令
说明        封装一组指令,使之仅对文件空间中的某个目录及其子目录生效
语法        <Directory directory-path> ... </Directory>
作用域        server config, virtual host
状态        核心(C)
模块        core

<Directory></Directory>用于封装一组指令,使之仅对某个目录及其子目录生效。任何可以在"directory"作用域中使用的指令都可以使用。Directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串。在通配符字符串中,"?"匹配任何单个的字符,"*"匹配任何字符序列。您也可以使用"[]"来确定字符范围。以上通配符都不能匹配"/"字符。所以<Directory /*/public_html>将无法匹配/home/user/public_html ,但<Directory /home/*/public_html>能够正确匹配。比如说:

<Directory /usr/local/httpd/htdocs>
Options Indexes FollowSymLinks
</Directory>

使用directory-path参数的时候要注意:它们必须与Apache用于访问文件的文件系统路径保持一致。赋予特定<Directory>的指令将无法对通过不同路径指向的同一个目录文件生效,比如说通过另外一个符号连接生成的路径。

扩展的正则表达式也可以通过附加一个"~"字符来使用。比如说:

<Directory ~ "^/www/(.+/)*[0-9]{3}">

将匹配/www/下所有由3个数字组成的目录。

如果有多个(非正则表达式)<Directory>配置段符合包含某文档的目录(或其父目录),那么指令将以短目录优先的规则进行应用。并包含.htaccess文件中的指令。比如说在

<Directory />
AllowOverride None
</Directory>

<Directory /home/>
AllowOverride FileInfo
</Directory>

中,访问文档/home/web/dir/doc.html的步骤如下:

    * 应用指令AllowOverride None(禁用.htaccess文件)
    * 应用指令AllowOverride FileInfo(针对/home目录)
    * 按顺序应用所有/home/.htaccess /home/web/.htaccess /home/web/dir/.htaccess中的FileInfo组指令。

正则表达式将在所有普通配置段之后予以考虑。所有的正则表达式将根据它们出现在配置文件中的顺序进行应用。比如说,以下配置:

<Directory ~ abc$>
# ......
</Directory>

正则表达式配置段将在所有普通的<Directory>.htaccess文件应用之后才予以考虑。所以正则表达式将匹配/home/abc/public_html/abc并予以应用。

请注意:Apache<Directory />的默认访问权限为"Allow from All"。这意味着Apache将伺服任何通过URL映射的文件。我们建议您将这个配置做如下屏蔽:

<Directory />
Order Deny,Allow
Deny from All
</Directory>

然后在您想要使之被访问的目录中覆盖此配置。参阅安全提示以获取更多详情。

一般来说<Directory>指令只会出现在f文件中,但它们也可能出现在任何其它配置文件中。<Directory>指令不可被嵌套使用,也不能出现在<Limit><LimitExcept>配置段中。
<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/f
Include /usr/local/apache2/conf/vhosts/*.conf

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

Include f
Include conf/vhosts/*.conf

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

root@host# apachectl configtest
Processing config file: /usr/local/apache2/f
Processing config file: /usr/local/apache2/conf/f
Processing config file: /usr/local/apache2/conf/f
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的用户起效,您可以这样使用:

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

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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。