Apache 学习笔记

配置文件与指令:

配置文件位置 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, 可以轻松的绕过你的限制

猜你喜欢

转载自blog.csdn.net/u013725455/article/details/80524001