配置文件与指令:
配置文件位置 apache/conf
默认配置文件:httpd.conf, 配置文件拆分,通过Include指令加载
指令配置:配置文件中的指令可能适用于整个服务器,也可能仅限于应用于特定目录,文件,主机或URL
全局:指令必须出现在配置文件中,并且不再任何一个<Directory>, <Location>, <VirtualHost>
或其他部分中。
局部:指令必须在某一个<Directory>
等中。
除了主要的配置文件之外,某些指令还可能.htaccess位于内容目录中的 文件中。 .htaccess文件主要针对无法访问主服务器配置文件的人员。您可以.htaccess在.htaccesshowto中阅读有关文件的更多信息 。
标题
有两种基本的容器,大多数容器是针对每一个请求的。封闭的指令仅仅被用于能够匹配容器的请求,<IfDefine>, <IfModule>, <IfVersion>
这些容器,仅在服务器启动或者重启时生效,如果容器的条件是true,那么指令将对所有的请求生效,如果条件为false, 指令将会被忽略。
<IfDefine>
中包含的指令,仅在httpd命令行中定义了适当的参数时,才会生效。
例如:使用以下配置,仅当服务器启动时才会将所有请求重定向到其他站点
<IfDefine ClosedForNow>
Redirect "/" "http://otherserver.example.com/"
</IfDefine>
<IfModule>
与<IfDefine>
相似,只是它包含的指令仅适用于服务器中可用的特定模块。模块必须在服务器中静态编译,或者必须动态编译,并且其LoadModule行必须在配置文件的最前面。只有在需要使用配置文件才能使用此指令时,无论是否安装某些模块.它不应该被用来包含您想要始终工作的指令,因为它可以抑制有关缺少模块的有用错误消息。
例如:MimeMagicFile指令仅在mod_mime_magic可用时生效
<IfModule mod_mime_magic.c>
MimeMagicFile "conf/magic"
</IfModule>
<IfVersion>
与<IfModule> <IfDefine>
相似,只是它包含了只在特定版本的服务器执行时才会应用的指令。该模块设计用于测试套件和大型网络,这些网络必须处理不同的httpd版本和不同的配置。。
<IfVersion >= 2.4>
# this happens only in versions greater or
# equal 2.4.0.
</IfVersion>
<IfVersion>
与<IfModule> <IfDefine>
可以通过使用“!”进行限制, 并且这些指令可以通过嵌套实现更复杂的的限制。
文件系统,Webspace和布尔表达式
最常用的容器是用于改变文件系统和webspace的特定的配置。首先,区分文件系统和webspace是非常重要的。文件系统是您的操作系统所看到的磁盘视图。例如,在linux系统中,apache httpd默认安装在/usr/local/apache2,在window文件系统中默认在c:/Program Files/Apache Group/Apache2, Webspace是由web服务器提供并且有客户端看到的网站视图,所以webspace路径/dir/ 在Apache中对应的路径是/usr/local/apache2/htdocs/dir/ 。webspace不需要直接映射到文件系统,因为网页可以从数据库或其他位置动态生成。
文件系统容器
<Directory>
和<Files>
指令,配合正则表达式,在部分文件系统中应用,被 <Directory>
包含的指令适用于指定的文件系统目录和该目录的所有子目录(以及这些目录中的文件)。使用.htaccess文件可以获得相同的效果。例如,在以下配置中,将为/var/web/dir1目录和所有子目录启用目录索引 。
<Directory "/var/web/dir1">
Options +Indexes
</Directory>
<Files >
包含的指令,适用于特定的文件,无论文件在哪个目录。例如,在以下配置中,拒绝访问任何名叫private.html的文件,无论该文件在哪个目录下。
<Files "private.html">
Require all denied
</Files>
为了解决在特定的目录下找文件, <Directory>
和<Files>
可以结合使用。例如,在以下配置将会拒绝访问 /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">
Require all denied
</Files>
</Directory>
Webspace 容器
<Location>
指令和正则表达式,会更改Webspace 中内容的配置,例如,拒绝访问任何以“/private”开头的URL路径,
例如:
http://yoursite.example.com/private, http://yoursite.example.com/private123,
http://yoursite.example.com/private/dir/file.html
以及任何其他请求开始的/private字符串。
<LocationMatch "^/private">
Require all denied
</LocationMatch>
<Location>
不需要与文件系统有任何关系,例如,以下示例显示如何将特定URL映射到由mod_status提供的内部Apache HTTP Server处理程序。文件系统中不需要存在 server-status 文件。
<Location "/server-status">
SetHandler server-status
</Location>
Overlapping Webspace (重叠的Webspace)
如果出现了Overlapping Webspace, 就必须考虑某些部分与指令的顺序,以 <Location>
举例:
<Location "/foo">
</Location>
<Location "/foo/bar">
</Location>
<Alias>
另一方面,反之亦然:
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"
ProxyPass 指令也是如此:
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
Wildcards and Regular Expressions (通配符与正则表达式)
<Directory> 、<Files>、<Location>
这些指令可以使用shell标准的通配符,如 fnmatchC标准库中的那样。字符“*”匹配任何字符序列,“?” 匹配任何单个字符,而“[ SEQ ]”中的任何字符匹配SEQ。“/”字符不会被任何通配符匹配; 它必须明确指定。
如果需要更灵活的匹配,每个容器都有一个正则表达式(正则表达式)对应<DirectoryMatch>
,<FilesMatch>
和<LocationMatch>
,允许在选择匹配时使用perl兼容的正则表达式。 但请参阅下面关于配置合并的部分,以了解如何使用正则表达式部分来更改应用指令的方式。
更改所有用户目录的配置的非正则表达式通配符部分可能如下所示:
<Directory "/home/*/public_html">
Options Indexes
</Directory>
使用正则表达式部分,我们可以一次拒绝对许多类型的图像文件的访问:
<FilesMatch "\.(?i:gif|jpe?g|png)$">
Require all denied
</FilesMatch>
包含命名组和反向引用的正则表达式,将以大写形式添加到相应名称的环境中。 这允许从表达式和模块(如mod_rewrite)中引用文件名路径和URL的元素。
<DirectoryMatch "^/var/www/combined/(?<SITENAME>[^/]+)">
require ldap-group "cn=%{env:MATCH_SITENAME},ou=combined,o=Example"
</DirectoryMatch>
Boolean expressions
<If
>指令根据布尔表达式表示的条件来更改配置。 例如,如果HTTP Referer标头未以“http://www.example.com/”开头,则以下配置会拒绝访问。
<If "!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*')">
Require all denied
</If>
什么时候使用
在文件系统容器和webspace容器之间进行选择其实很简单。将指令应用于驻留在文件系统中的对象时,请始终使用<Directory>
或<Files>
。将指令应用于不在文件系统中的对象(如从数据库生成的网页)时,请使用<Location>
。
当试图限制对文件系统中对象的访问时,一定不要使用<Location>
。这是因为许多不同的web空间位置(URL)可能映射到相同的文件系统位置,从而允许您的限制被规避。考虑使用一下配置:
<Location "/dir/">
Require all denied
</Location>
当请求http://yoursite.example.com/dir/时,可以正常工作。但是如果你在不区分大小写的文件系统上呢?然后,当请求是http://yoursite.example.com/DIR, 可以轻松的绕过你的限制