您的位置:首页 > 运维架构 > Apache

Apache+php+mysql的安装与配置 - 之二(Apache的文件目录配置)

2012-01-28 22:40 316 查看
Apache核心(Core)配置

Directory

语法 <Directory directory-path> ... </Directory>

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

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

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

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

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

<Directory />

AllowOverride None

</Directory>

<Directory /home/>

AllowOverride FileInfo

</Directory>

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

1. 应用指令AllowOverride None(禁用.htaccess文件)。

2. 应用指令AllowOverride FileInfo(针对/home目录)。

3. 按顺序应用所有/home/.htaccess 、/home/web/.htaccess 、/home/web/dir/.htaccess中的FileInfo组指令。

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

注意:Apache对<Directory />的默认访问权限为"Allow from All"。我们建议您将这个配置做如下屏蔽:

<Directory />

Order Deny,Allow

Deny from All

</Directory>

然后在您想要使之被访问的目录中覆盖此配置。

Location

语法 <Location URL-path|URL> ... </Location>

<Location>提供了基于URL的访问控制。<Location>配置段的处理位于<Directory>, .htaccess, <Files>之后,并依照在配置文件中出现的顺序进行处理。

<Location>配置段完全独立于文件系统之外来进行操作。

何时使用<Location>?

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

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

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

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

将匹配所有包含字符串"/extra/data"或"/special/data"的URL。

<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"的,那么它们就是匹配的。

Files

语法 <Files filename> ... </Files>

<Files>指令提供了基于文件名的访问控制。

<Files>段将根据它们在配置文件中出现的顺序被处理:在<Directory>段和.htaccess文件被处理之后,但在<Location>段之前。

请注意:<Files>能嵌入到<Directory>段中以限制它们作用的文件系统范围。

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

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

将匹配绝大部分常见的因特网图象格式。

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

<Directory>、<Location>、<Files>的配合使用



最常用的配置段是针对文件系统和网络空间特定位置的配置段。首先必须理解文件系统和网络空间这两个概念的区别,文件系统是指操作系统所看见的磁盘视图,比如,在Unix文件系统中,Apache会被默认安装到/usr/local/apache2 ,在Windows文件系统中,Apache会被默认安装到"C:/Program Files/Apache Group/Apache2"(注意:Apache始终用正斜杠而不是反斜杠作为路径的分隔符,即使是在Windows中)。相反,网络空间是网站被web服务器发送以及被客户在浏览器中所看到的视图。所以网络空间中的路径/dir/
在Apache采用默认安装路径的情况下对应于Unix文件系统中的路径/usr/local/apache2/htdocs/dir/ 。由于网页可以从数据库或其他地方动态生成,因此,网络空间无须直接映射到文件系统。
文件系统



<Directory>和<Files>指令与其相应的正则表达式版本(<DirectoryMatch>和<FilesMatch>)一起作用于文件系统的特定部分。

<Directory>配置段中的指令作用于指定的文件系统目录及其所有子目录,.htaccess文件可以达到同样的效果。下例中,/var/web/dir1 及其所有子目录被允许进行目录索引。

<Directory /var/web/dir1>

Options +Indexes

</Directory>

<Files>配置段中的指令作用于特定的文件名,而无论这个文件实际存在于哪个目录。下例中的配置指令如果出现在配置文件的主服务器段,则会拒绝对位于任何目录下的private.html的访问。

<Files private.html>

Order allow,deny

Deny from all

</Files>

<Files>和<Directory>段的组合可以作用于文件系统中的特定文件。

下例中的配置会拒绝对 /var/web/dir1/private.html 、/var/web/dir1/subdir2/private.html 、/var/web/dir1/subdir3/private.html等任何 /var/web/dir1/ 目录下private.html的访问。

<Directory /var/web/dir1>

<Files private.html>

Order allow,deny

Deny from all

</Files>

</Directory>

网络空间

<Location>指令与其相应的正则表达式版本(<LocationMatch>)一起作用于网络空间的特定部分。

下例中的配置会拒绝对任何以"/private"开头的URL路径的访问,比如:http://yoursite.example.com/private、http://yoursite.example.com/private123、http://yoursite.example.com/private/dir/file.html 等所有以"/private"开头的URL路径。

<Location /private>

Order Allow,Deny

Deny from all

</Location>

<Location>指令与文件系统无关,下例演示了如何将特定的URL映射到Apache内部的处理器mod_status ,而并不要求文件系统中确实存在server-status文件。

<Location /server-status>

SetHandler server-status

</Location>

通配符和正则表达式

<Directory>、<Files>、<Location>指令可以使用与C标准库中的fnmatch类似的shell风格的通配符。"*"匹配任何字符串,"?"匹配任何单个的字符,"[seq]"匹配seq序列中的任何字符,符号"/"不被任何通配符所匹配,所以必须显式地使用。

如果需要更复杂的匹配,这些容器都有一个对应的正则版本:<DirectoryMatch>、<FilesMatch>、<LocationMatch> ,可以使用与Perl兼容的正则表达式,以提供更复杂的匹配。但是还必须注意下面配置段的合并部分关于使用正则表达式会如何作用于配置指令的内容。

下例使用非正则表达式的通配符来改变所有用户目录的配置:

<Directory /home/*/public_html>

Options Indexes

</Directory>

下例使用正则表达式一次性拒绝对多种图形文件的访问:

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

Order allow,deny

Deny from all

</FilesMatch>

什么情况下用什么?

选择使用文件系统容器还是使用网络空间容器其实很简单。当指令应该作用于文件系统时,总是用<Directory>或<Files>;而当指令作用于不存在于文件系统的对象时,就用<Location>,比如一个由数据库生成的网页。

绝对不要试图用<Location>去限制对文件系统中的对象的访问,因为许多不同的网络空间路径可能会映射到同一个文件系统目录,从而导致你的访问限制被突破。比如:

<Location /dir/>

Order allow,deny

Deny from all

</Location>

上述配置对http://yoursite.example.com/dir/ 请求的确起作用。但是设想在一个不区分大小写的文件系统中,这个访问限制会被http://yoursite.example.com/DIR/ 请求轻易突破。而<Directory>指令才会真正作用于对这个位置的任何形式的请求。但是有一个例外,就是Unix文件系统中的符号连接(软连接),符号连接可以使同一个目录出现在文件系统中的多个位置。<Directory>指令将不重设路径名而直接追踪符号连接,因此,对于安全要求最高的,应该用Options指令禁止对符号连接的追踪。

不要认为使用大小写敏感的文件系统就无所谓了,因为有很多方法可以将不同的网络空间路径映射到同一个文件系统路径,所以,应当尽可能使用文件系统容器。但是也有一个例外,就是把访问限制放在<Location />配置段中可以很安全地作用于除了某些特定URL以外的所有URL。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: