`
oraclestudy
  • 浏览: 485936 次
文章分类
社区版块
存档分类

Apache 2.2配置段和容器

 
阅读更多

<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span lang="EN-GB" style="mso-font-kerning: 18.0pt; mso-ansi-language: en-gb">以下内容摘自笔者编著的<font color="#0000ff" size="4"><a href="http://www.dearbook.com.cn/book/129972">《网管员必读——网络应用》(第2版)</a></font>一书:</span></chsdate>

<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span lang="EN-GB" style="mso-font-kerning: 18.0pt; mso-ansi-language: en-gb"></span></chsdate>

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-GB" style="mso-font-kerning: 18.0pt; mso-ansi-language: en-gb">3.2.2</span></chsdate>Apache 2.2配置段和容器

“配置段”和“容器”都是用来指定配置文件的作用范围的。配置文件中指令的作用范围可能是整个服务器,也可能是特定的目录、文件、主机、URL。本节将要介绍的是如何使用配置段及.htaccess文件来改变配置指令的作用范围。

1配置段和容器的类型

配置段的类型包括在coremod_versionmod_proxy 3个模块中可以使用的指令包括<Directory><DirectoryMatch><Files><FilesMatch><IfDefine><IfModule><IfVersion><Location><LocationMatch><Proxy><ProxyMatch><VirtualHost>。这些指令都是配置段的容器。

容器有两种基本类型。大多数容器是针对各个请求的,包含于其中的指令仅对与该容器匹配的请求起作用,而容器<IfDefine><IfModule><IfVersion>仅在启动和重新启动时起作用,如果在启动时指定的条件成立,则其中的指令对所有的请求都有效,否则将被忽略。

<IfDefine>容器中的指令只有在httpd命令行中设定了特定的参数后才有效。下面的示例中限定只有在服务器用 httpd -DClosedForNow 方式启动时,所有的请求才会被重定向到另一个站点:

<IfDefine ClosedForNow>

</IfDefine>

<IfModule>容器与<IfDefine>很相似,但是其中的指令只有当服务器启用特定的模块时才有效(或是被静态地编译进了服务器,或是被动态装载进了服务器)。注意,配置文件中该模块的装载指令LoadModule行必须出现在此容器之前。这个容器应该仅用于无论特定模块是否安装,配置文件都能正常运转的场合;而不应该用于容器中的指令在任何情况下都必须生效的场合,因为它会抑制类似模块没找到之类的有用出错信息。

下面的示例中,指定MimeMagicFiles指令仅当mod_mime_magic模块启用时才有效。

<IfModule mod_mime_magic.c>

MimeMagicFile conf/magic

</IfModule>

<IfVersion>指令与<IfDefine><IfModule>也很相似,但是其中的指令只有当正在执行的服务器版本与指定的版本要求相符时才有效。这个模块被设计用于测试套件,以及在一个存在多个不同httpd版本的大型网络中需要针对不同版本使用不同配置的情况。
<IfVersion >= 2.1> # 仅在版本高于 <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.1.0</chsdate>的时候才生效

</IfVersion>

<IfDefine><IfModule><IfVersion>都可以在条件前加一个“!”符号以实现条件的否定,而且都可以嵌套以实现更复杂的配置。

2文件系统和网络空间

最常用的配置段是针对文件系统和网络空间特定位置的配置段。首先必须理解文件系统和网络空间这两个概念的区别:文件系统是指操作系统所看见的磁盘视图,比如,在UNIX系统中,Apache会被默认安装到“/usr/local/apache<chmetcnv w:st="on" unitname="”" sourcevalue="2.2" hasspace="False" negative="False" numbertype="1" tcsc="0">2.2<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: " times="" new=""><span lang="EN-US">”</span></span></chmetcnv>目录下,在Windows系统中,Apache会被默认安装到“Program Files/Apache Software Foundation/Apache<chmetcnv w:st="on" unitname="”" sourcevalue="2.2" hasspace="False" negative="False" numbertype="1" tcsc="0">2.2<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: " times="" new=""><span lang="EN-US">”</span></span></chmetcnv>目录下。相反,网络空间是网站被Web服务器发送及被客户在浏览器中所看到的视图。在Windows平台下,网络空间的默认安装路径为“Program Files/Apache Software Foundation/Apache2.2/ htdocs”。由于网页可以从数据库或其他地方动态生成,因此,网络空间无须直接映射到文件系统中。

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 42pt; HEIGHT: 31.5pt" type="#_x0000_t75"><imagedata src="file:///D:/DOCUME~1/winda/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg" o:title="注意"></imagedata></shape>
Apache始终用正斜杠而不是反斜杠作为路径的分隔符,即使是在Windows平台中。
1)文件系统容器

<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>

2)网络空间容器

<Location>指令与其相应的正则表达式版本(<LocationMatch>)一起作用于网络空间的特定部分。下面的示例中的配置会拒绝对任何以“/private”开头的URL路径的访问,如http://yoursite.example.com/privatehttp://yoursite.example.com/private123http://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>

3)通配符和正则表达式

<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>

4)选择文件系统容器,还是网络空间容器

选择使用文件系统容器,还是使用网络空间容器其实很简单。当指令作用于文件系统时,总是用<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

3.虚拟主机

“虚拟主机”是指在一个机器上运行多个网站(比如,www.company1.comwww.company2.com)。如果每个网站拥有不同的IP地址,则虚拟主机可以是“基于IP”的;如果只有一个IP地址,也可以是“基于主机名”的,其实现对最终用户是透明的。这一点,其实在介绍IIS网站架设中也有类似的说明,那就是网站的标识,它既可以基于IP地址,也可以基于“主机头值”(也就是域名),还可以基于端口。
Apache是率先支持基于IP的虚拟主机的服务器之一。1.1及其更新版本同时支持基于IP和基于主机名的虚拟主机。虚拟主机中所用的容器就是<VirtualHost>,它作用于特定的虚拟主机,为同一个机器上具有不同配置的多个主机提供支持。

有关虚拟主机的配置方法将在本章后面具体介绍。

4.代理

<Proxy><ProxyMatch>容器中的指令仅作用于通过mod_proxy代理服务器访问的、与指定URL匹配的站点。下面的示例中的配置会拒绝通过代理服务器访问cnn.com站点。

Order allow,deny

Deny from all

</Proxy>

5.总结

以上介绍了几种类型的容器及所用的指令,查阅指令的作用域,就可以知道哪些指令可以出现在哪些配置段中。从语法上看,允许在<Directory>段中使用的指令当然也可以在<DirectoryMatch><Files><FilesMatch><Location><LocationMatch><Proxy><ProxyMatch>段中使用,但也有例外:

AllowOverride指令只能出现在<Directory>段中。

Options(参数选项)中的FollowSymLinksSymLinksIfOwnerMatch只能出现在<Directory>段或者.htaccess文件中。Options指令不能用于<Files><FilesMatch>段。

除了各自的应用范围不同之外,它们之间有些配置段还是可以合并的。配置段会按非常特别的顺序依次生效,由于这会对配置指令的处理结果产生重大影响,因此理解它的流程非常重要。

合并的顺序如下。

1<Directory>(除了正则表达式)和.htaccess同时处理(如果允许的话,.htaccess的设置会覆盖<Directory>的设置);

2<DirectoryMatch>(和<Directory ~>);

3<Files><FilesMatch>同时处理;

4<Location><LocationMatch>同时处理。

除了<Directory>,每个组都按它们在配置文件中出现的顺序被依次处理,而<Directory>(上面的第1组),会按顺序由短到长被依次处理。例如:<Directory /var/web/dir>会先于<Directory /var/web/dir/subdir>被处理。如果有多个指向同一个目录的<Directory>段,则按它们在配置文件中的顺序被依次处理。用Include指令包含进来的配置被视为按原样插入到Include指令的位置。

位于<VirtualHost>容器中的配置段在外部对应的段处理完毕以后再处理,这样就允许虚拟主机覆盖主服务器的设置。

当请求是由mod_proxy处理的时候,<Proxy>容器将会在处理顺序中取代<Directory>容器的位置。也就是说,后面的段覆盖前面的相应的段。
分享到:
评论

相关推荐

    Apache HTTP Server Version 2.2 文档(2013.4.10最新)

    配置段(容器) 服务器全局配置 站点导航 停止和重启 suEXEC支持 致谢与译者声明 从2.0升级到2.2 从1.3升级到2.0 从URL到文件系统的映射 Apache 1.3 API 备忘录 APR中内存分配的调试 Apache 2.0 文档制作 Apache 2.0 ...

    Apache+Tomcat集群、优化配置

    4.2.2.2 安装Apache 4 4.3 配置、优化Apache 5 4.3.1 配置web容器信息的文件 5 4.3.2 新建uriworkermap.properties文件 5 4.3.3 JK-connector的安装 5 4.3.4 修改Apache的配置文件 6 4.3.5 配置多路处理模块 6 4.4 ...

    confluent-kafka-role:高度可配置的Ansible角色,可使用Confluent软件包“从头开始”安装和管理Apache Kafka和Apache Zookeeper

    卡夫卡融合角色 这个Ansible角色旨在使用安装和配置Apache Kafka和Apache Zookeeper。 所有配置都可以通过var传递,您可以在查看必要var的列表,并根据需要自定义它们。入门先决条件Ansible 2.2 +,Python和Pip。 ...

    openGTS_Config

      2.4 Apache Tomcat Servlet容器    2.5 MySQL数据库提供者    2.6 MySQL JDBC驱动程序   3安装/编译OpenGTS来源   3.1文件/安装OpenGTS来源  3.2设置环境变量   3.3编译支持GTS库文件   4初始化和...

    docker-drupal-php53:Ubuntu 12.04 上的 PHP 5.3 基础 Docker 映像,用于 Drupal 6 和 7 项目。 对于开发人员,请与 https 一起使用

    开发时,本项目需配合包含的工具Apache 2.2.x 为 HTTP 和 HTTPS 配置并安装了最少的模块。 PHP 5.3.x 带有生产设置MySQL客户端(APC) (最新版本) - Javascript 运行时。系统日志和公共日志目录来宾用户 ( ubuntu )...

    apache-php-mongo-dockerfiles:Dockerfiles

    Ubuntu 14.04 PHP:5.5 倍Mongo PHP 驱动程序(PECL 安装):1.5x PHP作曲家MongoDB 2.2x 二进制文件启用 mod_rewrite 的 Apache 2.4 ##Running & Building ###Using this container as a base 将此容器用作应用程序...

    axis-bin-1_4.zip

    Axis是第三代Apache SOAP,从2000年起,SOAP v2开发小组开始讨论如何让Axis更加灵活、可配置,以及能够处理SOAP和来自W3C的各种XML标准。通过不断地讨论和代码编写,Axis目前取得了如下成果: 速度提高。 Axis通过...

    SSM三大框架的整合.pdf

    简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 1.2、SpringMVC Spring MVC 属于 Spring Framework 的后续产品,已经融合在 Spring Web Flow 里面。Spring MVC 别离了控制器、模型...

    《JSP应用开发与实践》

    本资源主要介绍了JSP应用开发的基本概念和实践,包括JSP的技术特征、JSP网站的执行过程、JDK、Tomcat和MySQL的安装与配置、Eclipse开发工具的安装与使用等。 1. JSP技术特征 JSP技术所开发的Web应用程序是基于Java...

    Docker容器中运行nginx

    整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。 在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.1.1. 配置元数据 3.2.2. 实例化容器 3.2.2.1. 组成基于XML配置元数据 3.2.3. 多种bean 3.2.3.1. 命名bean 3.2.3.2. 实例化bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入...

    帆软实施培训手册.pptx

    2.2 安装并配置 Java 运行库 (JDK/JRE) * 从 Oracle 网站下载 Java 运行库 JDK * 配置 Java 运行环境变量 2.3 部署 tomcat 服务器 * 从 apache 官网下载 tomcat * 将下载的 zip 文件解压到任意目录 * 点击 tomcat...

    deltaspike

    -Java SE插件,可在容器外部引导JBoss Weld和Apache OpenWebBeans。 -JSF集成,包括向后移植Java EE 6的JSF 2.2功能。-JPA集成和事务支持。 -数据模块,用于在JPA之上创建易于使用的存储库模式。 -还提供了Quartz...

    Java数据库编程宝典2

    12.3 创建和配置Lo9in servlet 12.3.1 实现会员Web站点 12.3.2 创建Login页面 12.3.3 创建servlet 12.3.4 部署 12.4 使用JSP 12.4.1 在JSP中使用JavaBean 12.4.2 自动类型转换 12.4.3 创建和部署JDBC ...

    Java数据库编程宝典4

    12.3 创建和配置Lo9in servlet 12.3.1 实现会员Web站点 12.3.2 创建Login页面 12.3.3 创建servlet 12.3.4 部署 12.4 使用JSP 12.4.1 在JSP中使用JavaBean 12.4.2 自动类型转换 12.4.3 创建和部署JDBC ...

    Java数据库编程宝典1

    12.3 创建和配置Lo9in servlet 12.3.1 实现会员Web站点 12.3.2 创建Login页面 12.3.3 创建servlet 12.3.4 部署 12.4 使用JSP 12.4.1 在JSP中使用JavaBean 12.4.2 自动类型转换 12.4.3 创建和部署JDBC ...

    Java数据库编程宝典3

    12.3 创建和配置Lo9in servlet 12.3.1 实现会员Web站点 12.3.2 创建Login页面 12.3.3 创建servlet 12.3.4 部署 12.4 使用JSP 12.4.1 在JSP中使用JavaBean 12.4.2 自动类型转换 12.4.3 创建和部署JDBC ...

    centos7.5分布式平台搭建.docx

    8.1. 配置tomcat的环境变量和内存设置 29 8.2. 服务自启动 30 9. Mysql 30 9.1. 离线安装 30 9.2. 在线安装 30 9.2.1. 检测系统是否自带安装mysql 30 9.2.2. 下载yum包 30 9.2.3. 安装mysql 30 9.2.4. 启动服务 30 ...

    Android入门到精通源代码.

    2.2 JDK的安装和配置 2.2.1 安装JDK 2.2.2 配置JDK 2.3 Android SDK的下载和安装 2.3.1 下载Android SDK 2.3.2 安装Android SDK 2.3.3 创建Android虚拟设备 2.4 Eclipse的下载和安装 2.4.1 下载和安装Eclipse 2.4.2 ...

Global site tag (gtag.js) - Google Analytics