core - Apache 2.2 中文版参考手册

Apache HTTP Server 2.2

<-
   致谢 | 译者声明 | 本篇译者:金步国 | 本页最后更新:2006年1月20日 | 获取最新版本

Apache核心(Core)特性

说明Apache HTTP服务器核心提供的功能,始终有效
状态核心(C)
top

AcceptFilter 指令

说明根据协议类型对监听Socket进行优化
语法AcceptFilter protocol accept_filter
作用域server config
状态核心(C)
模块core
兼容性仅在 Apache 2.1.5 以后的版本中可用

这个指令使得操作系统根据协议类型对监听socket进行特别的优化。其基本前提是内核在数据接受完毕或一个完整的HTTP请求缓冲完成前不向服务器进程发送socket 。目前仅支持FreeBSD的接收过滤器(Accept Filter)和Linux的更原始的(more primitive)TCP_DEFER_ACCEPT

FreeBSD上的默认值是:

AcceptFilter http httpready
AcceptFilter https dataready

httpready接收过滤器(Accept Filter)在内核级别缓冲整个HTTP请求。一旦一个请求体被完整接收,内核将把它发送给服务器。参见accf_http(9)手册页以获得更详细的信息。因为HTTPS请求已经被加密了,所以只使用了accf_data(9)过滤器。

Linux上的默认值是:

AcceptFilter http data
AcceptFilter https data

Linux的TCP_DEFER_ACCEPT并不支持对http请求进行缓冲。除none之外的任何值都将在监听程序上启用TCP_DEFER_ACCEPT 。参见tcp(7)手册页以获得更多详情。

使用none将会为那个协议禁用接收过滤器(accept filter)。这对于像nntp这样需要服务器先发送数据的协议很有用处:

AcceptFilter nttp none

top

AcceptPathInfo 指令

说明是否接受附带多余路径名信息的请求
语法AcceptPathInfo On|Off|Default
默认值AcceptPathInfo Default
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性仅在 Apache 2.0.30 及以后的版本中可用

此指令决定是否接受在实际文件名(或实际目录中一个不存在的文件)后跟随多余路径名信息的请求。这个多余的路径名信息可以当作PATH_INFO环境变量传递给脚本。

比如说,假设/test/所指向的目录下只包括一个文件:here.html ,那么对/test/here.html/more/test/nothere.html/more的请求都会将PATH_INFO环境变量设为"/more"。

AcceptPathInfo指令的取值范围:

Off
仅当一个请求映射到一个真实存在的路径时,才会被接受。这样,如上述/test/here.html/more这样在真实文件名后跟随一个路径名的请求将会返回一个"404 NOT FOUND"错误。
On
只要前导路径可以映射到一个真实存在的文件,就可以接受该请求。这样,只要上述/test/here.html能够映射到一个有效的文件,那么对/test/here.html/more的请求就会被接收。
Default
是否接收附带多余路径名信息的请求由其对应的处理器来决定。对应普通文本的核心处理器默认会拒绝PATH_INFO 。而用于伺服脚本的处理器,比如cgi-scriptisapi-isa,默认会接受PATH_INFO

AcceptPathInfo指令存在的首要目的就是允许您覆盖处理器关于是否接受PATH_INFO的默认设置。这种覆盖是很必要的。比如说,当您使用了类似INCLUDES这样的过滤器来根据PATH_INFO产生内容时。核心处理器通常会拒绝这样的请求,而您就可以用下述的配置使这样的脚本成为可能:

<Files "mypaths.shtml">
Options +Includes
SetOutputFilter INCLUDES
AcceptPathInfo On
</Files>

top

AccessFileName 指令

说明分布式配置文件的名字
语法AccessFileName filename
默认值AccessFileName .htaccess
作用域server config, virtual host
状态核心(C)
模块core

如果为某个目录启用了分布式配置文件功能,那么在向客户端返回其中的文档时,服务器将在这个文档所在的各级目录中查找此配置文件。比如:

AccessFileName .acl

在返回文档/usr/local/web/index.html之前,服务器会为此指令读取 /.acl/usr/.acl/usr/local/.acl/usr/local/web/.acl 除非此功能以被如下配置所禁用:

<Directory />
AllowOverride None
</Directory>

参见

top

AddDefaultCharset 指令

说明当应答内容是text/plaintext/html时,在HTTP应答头中加入的默认字符集
语法AddDefaultCharset On|Off|charset
默认值AddDefaultCharset Off
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core

当且仅当应答内容是text/plaintext/html时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过<meta>标签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off 将会禁用此功能。AddDefaultCharset On 将启用Apache内部的默认字符集iso-8859-1 。您也可以指定使用在IANA注册过的字符集名字中的另外一个charset 。比如说:

AddDefaultCharset utf-8

AddDefaultCharset只应当在如下情况下使用:所有文本资源都使用同一种确定的字符集,且分别标记他们的字符集非常麻烦。一个这样的例子是向包含动态内容的资源中添加字符集参数(比如先前遗留的CGI脚本),这样可能会因为在输出中包含用户提供的数据而导致跨站点脚本攻击。但是请注意:更好的解决办法是修改或删除这些脚本,因为设置了默认的字符集以后将会使得浏览器的字符集自动探测功能失效。

参见

top

AddOutputFilterByType 指令

说明对特定的MIME类型指定输出过滤器
语法AddOutputFilterByType filter[;filter...] MIME-type [MIME-type] ...
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性Apache 2.0.33 以后可用,但在Apache 2.1 以后反对使用

此指令根据应答的MIME类型对请求激活特定的输出过滤器。由于下面将要讨论的问题,我们反对使用这个指令。同样的功能可以通过使用mod_filter模块获得。

下例使用了由mod_deflate提供的DEFLATE过滤器。它将把所有以text/htmltext/plain为标记的输出(不论静态或动态)在发送到客户端之前进行压缩。

AddOutputFilterByType DEFLATE text/html text/plain

如果您希望使用多个过滤器来处理内容,您可以用分号(;)来分隔它们的名字。并对每个过滤器使用AddOutputFilterByType指令。

下述配置将使所有标记为text/html的脚本输出首先被INCLUDES过滤器处理后再被DEFLATE过滤器处理。

<Location /cgi-bin/>
Options Includes
AddOutputFilterByType INCLUDES;DEFLATE text/html
</Location>

注意

在某些情况下,用AddOutputFilterByType来使用过滤器会遭受部分或完全的失败。比如,如果MIME类型不能确定,那么将不会有过滤器加于其上,从而使之回到DefaultType的设置。甚至当DefaultType与其相同的时候也是这样。

然而,如果您想确认对某些资源相关的内容类型确实使用了过滤器,您可以使用用诸如AddTypeForceType这样的办法。在一个(non-nph)CGI脚本中设定内容类型也很安全。

由类型决定的输出过滤器永远不会作用于来自代理的请求。

参见

top

AllowEncodedSlashes 指令

说明确定是否允许URL中使用经过编码的路径分割符
语法AllowEncodedSlashes On|Off
默认值AllowEncodedSlashes Off
作用域server config, virtual host
状态核心(C)
模块core
兼容性仅在 Apache 2.0.46 及以后的版本中可用

AllowEncodedSlashes指令允许使用包含经过编码的路径分割符的URL("%2F"→"/"或"%5C"→"\",取决于不同的系统)。默认情况下,这些URL将被一个包含"404"(未找到)错误的应答拒绝。

AllowEncodedSlashes On 通常和PATH_INFO配合使用。

注意

允许使用经过编码的斜线(路径分割符)并不意味着解码%2F%5C(仅仅取决于不同的系统)将会按原样出现在解码后的URL字符串中。

参见

top

AllowOverride 指令

说明确定允许存在于.htaccess文件中的指令类型
语法AllowOverride All|None|directive-type [directive-type] ...
默认值AllowOverride All
作用域directory
状态核心(C)
模块core

当服务器发现一个.htaccess文件(由AccessFileName指定)时,它需要知道在这个文件中声明的哪些指令能覆盖在此之前指定的配置指令。

仅允许存在于<Directory>配置段

AllowOverride仅在不包含正则表达式的<Directory>配置段中才是有效的。在<Location>, <DirectoryMatch>, <Files>配置段中都是无效的。

如果此指令被设置为None ,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess文件。

当此指令设置为 All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中。

directive-type可以是下列各组指令之一:

AuthConfig
允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
FileInfo
允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。
Indexes
允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。
Limit
允许使用控制主机访问的指令(Allow, Deny, Order)。
Options[=Option,...]
允许使用控制指定目录功能的指令(OptionsXBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。

例如以下指令只允许在.htaccess中使用AuthConfigIndexes组的指令:

AllowOverride AuthConfig Indexes

不在这两组中的指令将会导致服务器产生一个内部错误。

参见

top

AuthName 指令

说明用于HTTP认证的授权域
语法AuthName auth-domain
作用域directory, .htaccess
覆盖项AuthConfig
状态核心(C)
模块core

此指令为目录的授权域设置名字。此域将发送给客户端以使用户了解应当发送哪个用户名和密码。AuthName指令带有一个参数。如果域的名字中包含空格,则必须用引号引起来。它必须与AuthTypeRequire指令以及诸如AuthUserFileAuthGroupFile这样的指令一起工作。

例如:

AuthName "Top Secret"

提供给AuthName的字符串将出现在大多数浏览器提供的密码对话框中。

参见

top

AuthType 指令

说明用户认证类型
语法AuthType Basic|Digest
作用域directory, .htaccess
覆盖项AuthConfig
状态核心(C)
模块core

此指令选择了一个目录的用户认证类型。目前只实现了Basic(mod_auth_basic)和Digest(mod_auth_digest)。

要实现认证,还必须同时与AuthNameRequire指令一起使用。另外,服务器还必须包含一个认证支持模块(比如mod_authn_file)和一个授权支持模块(比如mod_authz_user)。

参见

top

CGIMapExtension 指令

说明定位CGI脚本解释器
语法CGIMapExtension cgi-path .extension
作用域directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性NetWare only

此指令用于定位Apache CGI脚本解释器。比如,"CGIMapExtension sys:\foo.nlm .foo"将把所有具有.foo后缀的CGI脚本文件传递给FOO解释器。

top

ContentDigest 指令

说明允许生成Content-MD5应答头
语法ContentDigest On|Off
默认值ContentDigest Off
作用域server config, virtual host, directory, .htaccess
覆盖项Options
状态核心(C)
模块core

此指令遵照RFC1854和RFC2068协议的定义启用了Content-MD5应答头的生成。

MD5是一种为不定长度的数据计算出一个"消息摘要"(有时也称为"指纹")的算法。并且保证数据中的任何变化都会反应在消息摘要的变化中。

Content-MD5头提供了一种端到端的针对整个消息体的信息完整性检查方法。代理或者客户端会检查此头以侦测在传输过程中,消息体是否产生了意外的改变。一个头的例子如下:

Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==

请注意,因为对每个请求都要进行消息摘要的运算(没有对其值进行缓存),所以这会对您的服务器造成性能方面的影响。

Content-MD5仅为由Apache核心伺服的文档进行发送,而对于由模块处理的文档则不予理会。比如说SSI文档、CGI脚本的输出、字节范围的应答都不包括这个头。

top

DefaultType 指令

说明在服务器无法由其他方法确定内容类型时,发送的默认MIME内容类型
语法DefaultType MIME-type
默认值DefaultType text/plain
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core

有时会发生这样的事:服务器会被要求提供一个文档,而这个文档的类型无法由它的MIME类型映射所决定。

服务器必须通知客户端其文档的内容类型。所以当一个未知类型出现时,将会使用DefaultType 。例如:

DefaultType image/gif

这样的配置对于里面有很多gif图片而有些在文件名中缺少.gif扩展名的目录非常合适。

注意,与ForceType指令的不同之处在于:此指令仅提供了默认的mime类型。所有其它mime类型的定义,包括文件的扩展名,或其它可以标识媒体类型的方法都会覆盖此默认值。

top

<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>指令只会出现在httpd.conf文件中,但它们也可能出现在任何其它配置文件中。<Directory>指令不可被嵌套使用,也不能出现在<Limit><LimitExcept>配置段中。

参见

top

<DirectoryMatch> 指令

说明封装一些指令并作用于文件系统中匹配正则表达式的所有目录及其子目录
语法<DirectoryMatch regex> ... </DirectoryMatch>
作用域server config, virtual host
状态核心(C)
模块core

<DirectoryMatch></DirectoryMatch>用于封装一组指令。与<Directory>类似,此指令将仅作用于指定名字的目录及其子目录。然而,它可以接受一个正则表达式作为参数。比如说:

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

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

参见

top

DocumentRoot 指令

说明组成网络上可见的主文档树的根目录
语法DocumentRoot directory-path
默认值DocumentRoot /usr/local/apache2/htdocs
作用域server config, virtual host
状态核心(C)
模块core

此指令设置了httpd伺服的目录。在没有使用类似Alias这样的指令的情况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。比如说:

DocumentRoot /usr/web

于是对http://www.my.host.com/index.html的访问就会指向/usr/web/index.html 。如果directory-path不是绝对路径,则被假定为是相对于ServerRoot的路径。

指定DocumentRoot时不应包括最后的"/"。

参见

top

EnableMMAP 指令

说明在递送中使用内存映射(memory-mapping)来读取文件
语法EnableMMAP On|Off
默认值EnableMMAP On
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core

此指令指示httpd在递送中如果需要读取一个文件的内容,它是否可以使用内存映射。当处理一个需要访问文件中的数据的请求时,比如说当递送一个使用mod_include进行服务器端分析的文件时,如果操作系统支持,Apache将默认使用内存映射。

这种内存映射有时会带来性能的提高,但在某些情况下,您可能会需要禁用内存映射以避免一些操作系统的问题:

  • 在一些多处理器的系统上,内存映射会减低一些httpd的性能。
  • 在挂载了NFS的DocumentRoot上,若已经将一个文件进行了内存映射,则删除或截断这个文件会造成httpd因为分段故障而崩溃。

在可能遇到这些问题的服务器配置过程中,您应当使用下面的命令来禁用内存映射:

EnableMMAP Off

对于挂载了NFS的文件夹,可以单独指定禁用内存映射:

<Directory "/path-to-nfs-files"> EnableMMAP Off </Directory>

top

EnableSendfile 指令

说明使用操作系统内核的sendfile支持来将文件发送到客户端
语法EnableSendfile On|Off
默认值EnableSendfile On
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性仅在 Apache 2.0.44 及以后的版本中可用

这个指令控制httpd是否可以使用操作系统内核的sendfile支持来将文件发送到客户端。默认情况下,当处理一个请求并不需要访问文件内部的数据时(比如发送一个静态的文件内容),如果操作系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件。

这个sendfile机制避免了分开的读和写操作以及缓冲区分配,但是在一些平台或者一些文件系统上,最好禁止这个特性来避免一些问题:

  • 一些平台可能会有编译系统检测不到的有缺陷的sendfile支持,特别是将在其他平台上使用交叉编译得到的二进制文件运行于当前对sendfile支持有缺陷的平台时。
  • 在Linux上启用IPv6时,使用sendfile将会触发某些网卡上的TCP校验和卸载bug。
  • 当Linux运行在Itanium处理器上的时候,sendfile可能无法处理大于2GB的文件。
  • 对于一个通过网络挂载了NFS文件系统的DocumentRoot (比如:NFS或SMB),内核可能无法可靠的通过自己的缓冲区服务于网络文件。

如果出现以上情况,你应当禁用sendfile :

EnableSendfile Off

针对NFS或SMB,这个指令可以被针对目录的设置覆盖:

<Directory "/path-to-nfs-files"> EnableSendfile Off </Directory>

top

ErrorDocument 指令

说明当遇到错误的时候服务器将给客户端什么样的应答
语法ErrorDocument error-code document
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性在Apache2.0中引用文字的语法发生了变化

当遇到问题或错误的时候,Apache能被配置为进行以下四种处理之一:

  1. 输出一个简单生硬的错误代码信息
  2. 输出一个经过定制的信息
  3. 重定向到一个本地的URL-path来处理这个问题(错误)
  4. 重定向到一个外部的URL来处理这个问题(错误)

默认会采取第1种方法,而第2-4种方法可以使用ErrorDocument指令后面跟随一个HTTP应答代码和一个URL或信息来进行配置。Apache有时会额外提供一些信息来描述所发生的问题/错误。

URL可以由一个斜杠(/)开头来指示一个本地URL(相对于DocumentRoot),或是提供一个能被客户端解释的完整的URL。此外还能提供一个可以被浏览器显示的消息。比如:

ErrorDocument 500 http://foo.example.com/cgi-bin/tester
ErrorDocument 404 /cgi-bin/bad_urls.pl
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Sorry can't allow you access today"

另外,特殊的"default"值可以被用来指定使用Apache内置的、简单的硬编码消息。当不需要这个定制特性的时候,可以用"default"恢复Apache内置的、简单的硬编码消息,否则将继承一个已有的ErrorDocument

ErrorDocument 404 /cgi-bin/bad_urls.pl

<Directory /web/docs>
ErrorDocument 404 default
</Directory>

请注意,如果您为ErrorDocument指定了一个外部的URL(比如说,任何在开头指示了类似"http"这样的访问方法的字符串),Apache将会向客户端发送一个重定向指令来告诉它在哪里找到这个文档,哪怕这个文档最后还是在这个服务器上。这里面包含着一些暗示:最重要的就是客户端无法接收到原始的错误状态代码,取而代之的是一个重定向状态代码。这将会使一些用状态代码来判断一个URL是否有效的web机器人或其它客户端产生误解。另外,如果您在"ErrorDocument 401"中使用了外部URL,客户端将不会提示用户输入密码,因为它根本没收到这样一个401的状态代码。所以,如果您想使用"ErrorDocument 401"指令,就必须指向一个本地的文档

Microsoft Internet Explorer (MSIE)在服务器端产生的错误信息"很小"的时候会忽略它们而用自己"友好的"错误信息进行取代。这个大小的阈值根据错误类型而不同。但一般来说,如果您的错误信息的大小在512 byte以上,MSIE就会显示这些服务器端产生的错误文档而不会屏蔽它们。您可以在微软知识库的文章Q294807中获取更多信息。

虽然大多数错误信息可以被改写,但是在有些情况下,将仍然使用某些内置的错误信息而不管ErrorDocument如何设置。特别是在检测到一个"畸形"请求的情况下,正常的请求处理过程将会被立即中断,并且立即返回一个内置的错误信息。这是为了防止某些不良请求可能导致的安全问题。

在2.0版以前,信息前面会用一个不配对的双引号作为前导标志。

参见

top

ErrorLog 指令

说明存放错误日志的位置
语法 ErrorLog file-path|syslog[:facility]
默认值ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows 和 OS/2)
作用域server config, virtual host
状态核心(C)
模块core

ErrorLog指令指定了当服务器遇到错误时记录错误日志的文件。如果file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径。

示例

ErrorLog /var/log/httpd/error_log

如果file-path以一个管道符号(|)开头,那么会为它指定一个命令来处理错误日志。

示例

ErrorLog "|/usr/local/bin/httpd_errors"

如果系统支持,使用"syslog"替代文件名将通过syslogd(8)来记载日志。默认将使用系统日志机制local7 ,但您可以用"syslog:facility"语法来覆盖这个设置,其中,facility的取值为syslog(1)中记载的任何一个名字。

示例

ErrorLog syslog:user

安全提示:参阅安全提示文档获得关于为什么当记录日志文件的目录对于启动服务器以外的用户可写时会对您的服务器构成安全威胁。

注意

当在非Unix平台上输入文件路径的时候,路径分隔符必须统一使用正斜线(/),即使那个平台本身使用反斜线(\)。

参见

top

FileETag 指令

说明用以创建ETag应答头的文件的属性
语法FileETag component ...
默认值FileETag INode MTime Size
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core

FileETag指令配置了当文档是基于一个文件时用以创建ETag(实体标签)应答头的文件的属性(ETag的值用于进行缓冲管理以节约网络带宽)。在Apache1.3.22及以前,ETag的值总是由文件的inode(索引节点)、大小、最后修改时间决定。FileETag指令可以让您选择(如果您想进行选择)这其中哪些要素将被使用。主要关键字如下:

INode
文件的索引节点(inode)数
MTime
文件的最后修改日期及时间
Size
文件的字节数
All
所有存在的域,等价于:

FileETag INode MTime Size

None
如果一个文档是基于文件的,则不在应答中包含任何ETag

可以在INode, MTime, Size前加上"+"或"-"以改变由上层继承下来的默认值。任何没有上述前缀的关键字将立刻完全取消继承下来的设置。

如果一个目录的配置包含了"FileETag INode MTime Size"而其一个子目录包含了"FileETag -INode"那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于"FileETag MTime Size"。

top

<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文件当中。这将允许用户在文件层面上控制对它们自己文件的访问。

参见

top

<FilesMatch> 指令

说明包含作用于与正则表达式匹配的文件名的指令
语法<FilesMatch regex> ... </FilesMatch>
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

<FilesMatch>指令就像<Files>指令一样提供了针对文件名的访问控制。然而,它使用的是正则表达式。比如说:

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

将匹配最常见的internet图形文件格式。

参见

top

ForceType 指令

说明强制所有匹配的文件被作为指定的MIME类型进行伺服
语法ForceType MIME-type|None
作用域directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性Apache 2.0之后从其它模块移动到核心中

当此指令放入.htaccess文件或<Directory><Location><Files>配置段时,此指令强制所有匹配的文件被当作在MIME-type中指定的Content-Type来伺服。比如说,如果您有一个包含大量GIF文件的目录,可您又不想全都为它们加上".gif"扩展名的话,您可以这样做:

ForceType image/gif

请注意:与DefaultType指令不同,此指令将覆盖所有的mime类型关联,包括标识文件类型的扩展名。

你可以通过使用"None"覆盖任何ForceType设置:

# 强制所有文件为 image/gif:
<Location /images>
ForceType image/gif
</Location>

# 但是正常的mime类型关联在这里:
<Location /images/mixed>
ForceType None
</Location>

top

HostnameLookups 指令

说明启用对客户端IP的DNS查找
语法HostnameLookups On|Off|Double
默认值HostnameLookups Off
作用域server config, virtual host, directory
状态核心(C)
模块core

此指令启用了DNS查询,使得主机名能被记入日志(并用REMOTE_HOST变量传递给CGI/SSI)。参数Double指定进行一次双向DNS查询。也就是说在一次反向查询之后,再对返回的结果进行一次正向查询。在正向查询结果中至少应该有一个ip地址与初始的地址相符。(在"tcpwrappers"中的术语是PARANOID)

不论此处如何设置,当您使用mod_authz_host来根据主机名控制访问的时候,就会执行一次双向查询。这对安全来说非常必要。请注意如果您没有设置"HostnameLookups Double",这种双向查询的结果不是自动生成的。比如说:如果仅仅设置了"HostnameLookups On"而且请求是针对一个根据主机名做了限制的对象,不论双向查询是否失败,CGI还是会把单向查询的结果用REMOTE_HOST来传送。

默认值设置为 Off 是为了那些不需要进行反向查询的站点节约网络带宽考虑的。这对最终用户也是有益的,因为这样他们就不用忍受查询造成的延迟了。高访问量的网站应该将此指令设置为 Off 因为DNS查询会造成明显的时间消耗。在bin目录下的logresolve工具可以在离线的情况下对已经记入日志的IP地址进行主机名的查询。

top

<IfDefine> 指令

说明封装一组只有在启动时当测试结果为真时才生效的指令
语法<IfDefine [!]parameter-name> ... </IfDefine>
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

<IfDefine test>...</IfDefine>配置段用于包含有条件的指令。<IfDefine>配置段中的指令仅当test结果为真时才进行处理。如果test为假。此配置段中的指令将会被忽略。

<IfDefine>配置段中的test可以为以下两种形式之一:

  • parameter-name
  • !parameter-name

在第一种情况下,仅当parameter-name已经定义的情况下才对开始和结束标记之间的指令进行处理。第二种情况则截然相反。仅当parameter-name没有定义的情况下才进行指令的处理。

parameter-name是在服务启动时,通过httpd命令行的 -Dparameter 这样的形式指定的。

<IfDefine>配置段是可以嵌套的,从而可以实现简单的多参数测试。比如说:

httpd -DReverseProxy ...

# httpd.conf
<IfDefine ReverseProxy>
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/libproxy.so
</IfDefine>

top

<IfModule> 指令

说明封装指令并根据指定的模块是否启用为条件而决定是否进行处理
语法<IfModule [!]module-file|module-identifier> ... </IfModule>
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core
兼容性module-identifier仅在 Apache 2.1 及以后的版本中可用

<IfModule test>...</IfModule>配置段用于封装根据指定的模块是否启用而决定是否生效的指令。在<IfModule>配置段中的指令仅当test为真的时候才进行处理。如果test为假,所有其间的指令都将被忽略。

<IfModule>段中的test可以为以下两种方式之一:

  • module
  • !module

在第一种情况下,起始和结束标记之间的指令仅当module被载入后才被执行。此模块可以为编译时静态链接进核心的模块或是使用LoadModule指令动态载入的模块。第二种情况则相反,仅当module没有载入时才进行指令的处理。

module可以是模块的标识符或者是编译模块时的文件名。比如,rewrite_module就是一个模块标识符,而mod_rewrite.c则是编译模块时的文件名。如果模块包含多个源代码文件,您应当使用包含STANDARD20_MODULE_STUFF字符串的那个。

<IfModule>配置段是可以嵌套的,从而可以实现简单的多模块测试。

此配置段主要用于需要根据某个特定的模块是否存在来决定是否使用某些配置的时候。指令一般都放在<IfModule>配置段中。
top

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/conf/ssl.conf
Include /usr/local/apache2/conf/vhosts/*.conf

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

Include conf/ssl.conf
Include conf/vhosts/*.conf

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

root@host# apachectl configtest
Processing config file: /usr/local/apache2/conf/ssl.conf
Processing config file: /usr/local/apache2/conf/vhosts/vhost1.conf
Processing config file: /usr/local/apache2/conf/vhosts/vhost2.conf
Syntax OK

参见

top

KeepAlive 指令

说明启用HTTP持久链接
语法KeepAlive On|Off
默认值KeepAlive On
作用域server config, virtual host
状态核心(C)
模块core

Keep-Alive扩展自HTTP/1.0和HTTP/1.1的持久链接特性。提供了长效的HTTP会话,用以在同一个TCP连接中进行多次请求。在某些情况下,这样的方式会对包含大量图片的HTML文档造成的延时起到50%的加速作用。在Apache1.2版本以后,您可以设置 KeepAlive On 以启用持久链接。

对于HTTP/1.0的客户端来说,仅当客户端指定使用的时候才会使用持久链接连接。此外,仅当能够预先知道传输的内容长度时,才会与HTTP/1.0的客户端建立持久链接连接。这意味着那些长度不定的内容,诸如CGI输出、SSI页面、以及服务器端生成的目录列表等内容一般来说将无法使用与HTTP/1.0客户端建立的持久链接连接。而对于HTTP/1.1的客户端来说,如果没有进行特殊指定,持久将是默认的连接方式。如果客户端进行了请求,将使用分块编码以解决在持久链接里发送未知长度内容的问题。

参见

top

KeepAliveTimeout 指令

说明持久链接中服务器在两次请求之间等待的秒数
语法KeepAliveTimeout seconds
默认值KeepAliveTimeout 5
作用域server config, virtual host
状态核心(C)
模块core

Apache在关闭持久连接前等待下一个请求的秒数。一旦收到一个请求,超时值将会被设置为Timeout指令指定的秒数。

对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。

top

<Limit> 指令

说明仅对指定的HTTP方法进行访问控制
语法<Limit method [method] ... > ... </Limit>
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

访问控制一般来说是对所有的访问方法都生效的,这也是我们普遍希望达到的效果。一般情况下,访问控制指令不应该放入<Limit>段中

<Limit>指令的目的是限制访问控制的效果使其仅作用于某些HTTP方法。对于其它方法,<Limit>括号中的访问限制将不起任何作用。下例中的访问控制仅作用于POST, PUT, DELETE方法,其它方法不受任何影响:

<Limit POST PUT DELETE>
Require valid-user
</Limit>

列出的方法名可为下列的一个或多个:GET, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK方法名是大小写敏感的。如果对GET进行了定义,它会同时作用于HEAD请求。TRACE方法不能被限制。

应当总是优先使用<LimitExcept>段来限制访问,而不是<Limit>段。因为<LimitExcept>段能够防范所有HTTP方法。
top

<LimitExcept> 指令

说明对除了指定方法以外的所有HTTP方法进行访问控制
语法<LimitExcept method [method] ... > ... </LimitExcept>
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

<LimitExcept></LimitExcept>用于封装一组访问控制指令,并将其作用于所有没有在参数中标出的HTTP方法。也就是说,与<Limit>相反,它用于控制标准的和非标准以及无法辨识的方法。

比如:

<LimitExcept POST GET>
Require valid-user
</LimitExcept>

top

LimitInternalRecursion 指令

说明指定内部重定向和嵌套子请求的最大数量
语法LimitInternalRecursion number [number]
默认值LimitInternalRecursion 10
作用域server config, virtual host
状态核心(C)
模块core
兼容性仅在 Apache 2.0.47 及以后的版本中可用

例如,当使用Action指令内部重定向原始请求到一个CGI脚本时,一个内部重定向将会发生。子请求是Apache的一个用于找到如果一个URI被请求时将会发生什么的机制。例如,mod_dir使用子请求来寻找那些根据DirectoryIndex指令应当被列出的文件。

LimitInternalRecursion可以防止服务器进入一个内部重定向或者子请求的死循环而崩溃。这样的死循环通常由错误的配置引起。

这个指令存储了两个不同的限制,这两个限制是基于每个单独的请求进行计算的。第一个number限制了内部重定向链的最大长度(一个接一个)。第二个number限制了子请求的最大嵌套层数。如果你只指定了一个number ,那么将会被同时应用于这两个限制。

示例

LimitInternalRecursion 5

top

LimitRequestBody 指令

说明限制客户端发送的HTTP请求体的最大字节长度
语法LimitRequestBody bytes
默认值LimitRequestBody 0
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

bytes在0(意味着无限制)到2147483647(2GB)间限制了请求体所允许的字节数。

LimitRequestBody可以让用户在其作用范围内(整个服务器、特定目录、特定文件、特定位置)设置一个允许客户端发送的HTTP请求体的最大字节长度的限制。如果客户端的请求超出了这个限制,服务器会回应一个错误而不是伺服这个请求。一个普通请求的信息体在很大程度上取决于资源的自然属性和这个资源允许的方法。CGI脚本经常用消息体把表单的信息传递给服务器。使用PUT方法至少会需要与服务器期望从这个资源得到的信息量差不多大小的值。

此指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。

比如,如果您允许文件上传到某个位置,而且希望能将上传文件的大小设置为100K,您可以使用下面的指令:

LimitRequestBody 102400

top

LimitRequestFields 指令

说明限制接受客户端请求中HTTP请求头域的数量
语法LimitRequestFields number
默认值LimitRequestFields 100
作用域server config
状态核心(C)
模块core

Number是一个0(意味着不限)到32767之间的整数。默认值为编译时的常量DEFAULT_LIMIT_REQUEST_FIELDS(发布值为100)。

LimitRequestFields指令允许服务器管理员修改在一个HTTP请求中的请求头域的数量限制。服务器需要此值大于一个普通客户端请求中包含头域的数量。一个客户端请求头域的数量很少大于20,但根据客户端的不同这个数字有很大的差别,经常取决于用户配置他们的浏览器扩展以支持更详细的内容协商。可选的HTTP扩展经常使用请求头域来实现。

这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。如果正常使用的客户端得到了服务器的错误应答,指出其在请求中发送了过多的头域,您应该适当的增大此值。

例如:

LimitRequestFields 50

top

LimitRequestFieldSize 指令

说明限制客户端发送的请求头的字节数
语法LimitRequestFieldsize bytes
默认值LimitRequestFieldsize 8190
作用域server config
状态核心(C)
模块core

bytes指定了HTTP请求头允许的字节大小。

LimitRequestFieldSize指令允许服务器管理员增加或减少HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。SPNEGO的认证头最大可能达到12392字节。

这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。

举例如下:

LimitRequestFieldSize 4094

一般情况下,请不要改变这个设置,而是保持其默认设置。
top

LimitRequestLine 指令

说明限制接受客户端发送的HTTP请求行的字节数
语法LimitRequestLine bytes
默认值LimitRequestLine 8190
作用域server config
状态核心(C)
模块core

bytes将设置HTTP请求行的字节数限制。

LimitRequestLine指令允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI、协议版本,所以LimitRequestLine指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在GET请求中所传递的查询部分的所有信息。

这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。

举例如下:

LimitRequestLine 4094

一般情况下,不需要改变此设置的默认值。
top

LimitXMLRequestBody 指令

说明限制基于XML的请求体的大小
语法LimitXMLRequestBody bytes
默认值LimitXMLRequestBody 1000000
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

限制基于XML的请求体大小的最大字节数,"0"将禁用这一检查。

比如:

LimitXMLRequestBody 0

top

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

参见

top

<LocationMatch> 指令

说明将封装的指令作用于正则表达式匹配的URL
语法<LocationMatch regex> ... </LocationMatch>
作用域server config, virtual host
状态核心(C)
模块core

<LocationMatch><Location>指令相同,提供了基于URL的访问控制。但它使用正则表达式作为参数,而不是简单字符串。比如:

<LocationMatch "/(extra|special)/data">

将匹配包含子串"/extra/data"或"/special/data"的URL。

参见

top

LogLevel 指令

说明控制错误日志的详细程度
语法LogLevel level
默认值LogLevel warn
作用域server config, virtual host
状态核心(C)
模块core

LogLevel用于调整记录在错误日志中的信息的详细程度。(参见ErrorLog指令)。可以选择下列level,依照重要性降序排列:

Level 描述 例子
emerg 紧急(系统无法使用)"Child cannot open lock file. Exiting"
alert 必须立即采取措施"getpwuid: couldn't determine user name from uid"
crit 致命情况"socket: Failed to get a socket, exiting child"
error 错误情况"Premature end of script headers"
warn 警告情况"child process 1234 did not exit, sending another SIGHUP"
notice 一般重要情况"httpd: caught SIGBUS, attempting to dump core in ..."
info 普通信息"Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."
debug 调试信息"Opening config file ..."

当指定了某个级别时,所有级别高于它的信息也会被同时记录。比如,指定 LogLevel info ,则所有noticewarn级别的信息也会被记录。

建议至少使用crit级别。

示例如下:

LogLevel notice

注意

当错误日志是一个单独分开的正式文件的时候,notice级别的消息总是会被记录下来,而不能被屏蔽。但是,当使用syslog来记录时就没有这个问题。

top

MaxKeepAliveRequests 指令

说明一个持久链接中允许的最大请求数量
语法MaxKeepAliveRequests number
默认值MaxKeepAliveRequests 100
作用域server config, virtual host
状态核心(C)
模块core

MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。

例如:

MaxKeepAliveRequests 500

top

NameVirtualHost 指令

说明为一个基于域名的虚拟主机指定一个IP地址(和端口)
语法NameVirtualHost addr[:port]
作用域server config
状态核心(C)
模块core

如果您要配置基于域名的虚拟主机NameVirtualHost指令就是您必须的指令之一。

尽管addr参数可以使用主机名,但建议您还是使用IP地址。比如:

NameVirtualHost 111.22.33.44

使用NameVirtualHost指令,您可以指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。在一个防火墙或是其它代理接受了请求并把它转到服务器所在的另外一个IP地址上的情况下,您必须指定伺服请求的机器物理界面上的IP地址。如果您对于多个地址使用了多个基于域名的虚拟主机,您应该为每个地址使用这个指令。

注意

"主服务器"和任何其它"_default_"服务器都不会伺服发送到NameVirtualHost IP地址的请求。(除非您指定了NameVirtualHost,但没有为这个地址指定任何VirtualHost)。

另外,您还可以为您使用的基于域名的虚拟主机指定一个端口号。比如:

NameVirtualHost 111.22.33.44:8080

IPv6地址必须封装在一对方括号内,如下例所示:

NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080

为了接受所有界面的请求,您可以使用"*":

NameVirtualHost *

<VirtualHost>指令的参数

请注意,<VirtualHost>指令的参数必须与NameVirtualHost指令的参数完全匹配。

NameVirtualHost 1.2.3.4
<VirtualHost 1.2.3.4>
# ...
</VirtualHost>

参见

top

Options 指令

说明配置在特定目录中可以使用哪些特性
语法Options [+|-]option [[+|-]option] ...
默认值Options All
作用域server config, virtual host, directory, .htaccess
覆盖项Options
状态核心(C)
模块core

Options指令控制了在特定目录中将使用哪些服务器特性。

option可以为None ,在这种情况下,将不启用任何额外特性。或设置为以下选项中的一个或多个:

All
MultiViews之外的所有特性。这是默认设置。
ExecCGI
允许使用mod_cgi执行CGI脚本。
FollowSymLinks
服务器允许在此目录中使用符号连接。

注意:即使服务器会使用符号连接,但它不会改变用于匹配<Directory>段的路径名。

注意:如果此配置位于<Location>配置段中,则此设置会被忽略

Includes
允许使用mod_include提供的服务器端包含。
IncludesNOEXEC
允许服务器端包含,但禁用"#exec cmd"和"#exec cgi"。但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。
Indexes
如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表。
MultiViews
允许使用mod_negotiation提供内容协商的"多重视图"(MultiViews)。
SymLinksIfOwnerMatch
服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。

注意

如果此配置出现在<Location>配置段中,此选项将被忽略。

一般来说,如果一个目录被多次设置了Options ,则最特殊的一个会被完全接受(其它的被忽略),而各个可选项的设定彼此并不融合(参见配置段的合并)。然而,如果所有作用于Options指令的可选项前都加有"+"或"-"符号,此可选项将被合并。所有前面加有"+"号的可选项将强制覆盖当前的可选项设置,而所有前面有"-"号的可选项将强制从当前可选项设置中去除。

比如,没有任何"+"或"-"符号:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>

<Directory /web/docs/spec>
Options Includes
</Directory>

那么只有将Includes设置到/web/docs/spec目录上。然而如果第二个Options指令使用了"+"和"-"符号:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>

<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>

那么就会有FollowSymLinksIncludes设置到/web/docs/spec目录上。

注意

使用 -IncludesNOEXEC-Includes 时,不论前面如何设置,都会完全禁用服务器端包含。

没有其它设置时,默认设置为 All

top

Require 指令

说明指定哪些认证用户允许访问该资源
语法Require entity-name [entity-name] ...
作用域directory, .htaccess
覆盖项AuthConfig
状态核心(C)
模块core

这个指令指定哪些认证用户允许访问该资源。这些限制由授权支持模块实现。语法如下:

Require user userid [userid] ...
只有指定的用户可以访问此目录。
Require group group-name [group-name] ...
只有隶属于指定组的用户可以访问此目录。
Require valid-user
所有有效用户都可以访问此目录。

提供Require指令的授权支持模块有:mod_authz_user, mod_authz_groupfile, mod_authnz_ldap, mod_authz_dbm, mod_authz_owner

Require必须伴随AuthNameAuthType指令,以及诸如AuthUserFileAuthGroupFile指令(用以定义用户和用户组)以确保其能够正确工作。例如:

AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /web/users
AuthGroupFile /web/groups
Require group admin

使用这种方法提供的访问控制对所有方法都有效。这是一般情况下期望达到的效果。如果您仅希望对某个特定的方法加以限制,而不涉及其它方法时,您可以将Require语句放入<Limit>配置段中。

如果RequireAllowDeny指令同时使用,那么这些指令之间的相互作用由Satisfy指令控制。

在子目录中删除访问控制

下面的例子展示了如何使用Satisfy指令在一个受保护的目录下的子目录中取消访问控制。使用这种方法必须十分小心,因为它取消了mod_authz_host实现的任何访问控制。

<Directory /path/to/protected/>
Require user david
</Directory>
<Directory /path/to/protected/unprotected>
# 该目录下的所有认证和访问控制都被取消了
Satisfy Any
Allow from all
</Directory>

参见

top

RLimitCPU 指令

说明限制Apache子进程派生的进程占用CPU的最大秒数
语法RLimitCPU seconds|max [seconds|max]
默认值未定义,使用操作系统默认值
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root运行服务器或是在初始化启动语句中进行设置。

这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。

CPU资源限制表示为每进程占用的秒数。

参见

top

RLimitMEM 指令

说明限制由Apache子进程派生的进程占用的最大内存字节数
语法RLimitMEM bytes|max [bytes|max]
默认值未定义,使用操作系统默认值
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root运行服务器或是在初始化启动语句中进行设置。

这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。

内存资源限制表示为每进程占用的字节数。

参见

top

RLimitNPROC 指令

说明限制由Apache子进程派生的进程所派生的进程数目
语法RLimitNPROC number|max [number|max]
默认值未定义,使用操作系统默认值
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root运行服务器或是在初始化启动语句中进行设置。

这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。

进程限制控制了每个用户的进程数。

注意

如果CGI进程不是以web服务器的uid启动的,那么这个指令将限制服务器自己能够创建的进程数目。此种情况将在error_log中以"cannot fork"进行记录。

参见

top

Satisfy 指令

说明主机级别的访问控制和用户认证之间的相互关系
语法Satisfy Any|All
默认值Satisfy All
作用域directory, .htaccess
覆盖项AuthConfig
状态核心(C)
模块core
兼容性2.0.51及以后版本中受<Limit><LimitExcept>指令影响

同时使用AllowRequire时的访问策略。参数可以设置为 AllAny 。这个指令仅在某个特定区域的访问控制同时被用户名/密码客户端主机地址进行限定的时候起作用。默认行为(All)采取客户端首先通过地址访问限制并且输入有效的用户名和密码的方式。使用可选项 Any 将使客户端在通过主机限制或是输入一个有效的用户名和密码两种方式之一得到访问权限。这样,就可以通过密码来限制一个区域的访问,但允许某些特定地址的客户端访问时不需要输入密码。

比如,如果您想让您局域网内的用户访问您的web网站时不受限制,但局域网外的用户需提供密码才能进行访问,您可以采取类似如下的配置:

Require valid-user
Allow from 192.168.1
Satisfy Any

从2.0.51版本开始,Satisfy指令可以被限定于由<Limit><LimitExcept>配置段指定的特定的方法。

参见

top

ScriptInterpreterSource 指令

说明定位CGI脚本解释器
语法ScriptInterpreterSource Registry|Registry-Strict|Script
默认值ScriptInterpreterSource Script
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性仅用于Win32;Registry-Strict选项仅在 Apache 2.0 及以后的版本中可用

这个指令控制Apache如何找到运行CGI脚本的解释器。默认为Script ,使用在脚本中以"#!"行指定的解释器。在Win32上这一行通常看上去像:

#!C:/Perl/bin/perl.exe

或者,如果perl的位置已经在PATH中指定,则可以简单的写成:

#!perl

设置为 ScriptInterpreterSource Registry 将使用脚本文件扩展名(比如.pl)作为搜索项对Windows注册表项HKEY_CLASSES_ROOT进行搜索。 这个命令由注册表子键Shell\ExecCGI\CommandShell\Open\Command定义(如果前者不存在)。如果无法找到该注册表项,Apache将采用默认值:Script

安全

ScriptInterpreterSource Registry 和使用了ScriptAlias的目录一起使用时需要非常小心,因为Apache会执行这个目录下的所有文件。Registry设置可能会导致对不可执行文件的不期望的程序调用。例如,在大多数Windows上默认打开.htm文件的程序是IE,所以任何一个对脚本目录中.htm文件的请求将会在服务器后台打开一个IE。这是一个让你的服务器在数分钟内崩溃的好办法。

Registry-Strict选项和Registry差不多,但是只使用Shell\ExecCGI\Command子键。ExecCGI键不是一个普通的键。它必须在注册表中手动配置,从而可以防止意外的程序调用。

top

ServerAdmin 指令

说明服务器返回给客户端的错误信息中包含的管理员邮件地址
语法ServerAdmin email-address|URL
作用域server config, virtual host
状态核心(C)
模块core

ServerAdmin设置了在所有返回给客户端的错误信息中包含的管理员邮件地址。如果httpd不能将提供的参数识别为URL,它就会假定它是一个email-address ,并在超连接中用在mailto:后面。推荐使用一个Email地址,因为许多CGI脚本是这样认为的。如果你确实想使用URL,一定要保证指向一个你能够控制的服务器,否则用户将无法确保一定可以和你取得联系。

为这个目的专门设置一个邮箱是值得的,比如:

ServerAdmin [email protected]

因为用户一般不会注意到他们在讨论服务器的问题!

top

ServerAlias 指令

说明匹配一个基于域名的虚拟主机的别名
语法ServerAlias hostname [hostname] ...
作用域virtual host
状态核心(C)
模块core

ServerAlias指令设定主机的别名,用于基于域名的虚拟主机

<VirtualHost *>
ServerName server.domain.com
ServerAlias server server2.domain.com server2
# ...
</VirtualHost>

参见

top

ServerName 指令

说明服务器用于辨识自己的主机名和端口号
语法ServerName fully-qualified-domain-name[:port]
作用域server config, virtual host
状态核心(C)
模块core
兼容性在2.0版中,这个指令代替了1.3版的Port指令的功能

ServerName指令设置了服务器用于辨识自己的主机名和端口号。这主要用于创建重定向URL。比如,一个放置web服务器的主机名为simple.example.com ,但同时有一个DNS别名www.example.com 。而您希望web服务器更显著一点,您可以使用如下的指令:

ServerName www.example.com:80

当没有指定ServerName时,服务器会尝试对IP地址进行反向查询来推断主机名。如果在ServerName中没有指定端口号,服务器会使用接受请求的那个端口。为了加强可靠性和可预测性,您应该使用ServerName显式的指定一个主机名和端口号。

如果使用的是基于域名的虚拟主机,在<VirtualHost>段中的ServerName将是为了匹配这个虚拟主机,在"Host:"请求头中必须出现的主机名。

参见UseCanonicalNameUseCanonicalPhysicalPort指令以获得关于自引用URL(比如使用mod_dir模块)是需要指定一个特定端口,还是使用客户端请求的端口号的更详细的信息。

参见

top

ServerPath 指令

说明为兼容性不好的浏览器访问基于域名的虚拟主机保留的URL路径名
语法ServerPath URL-path
作用域virtual host
状态核心(C)
模块core

ServerPath指令为主机设置了保守的(legacy)URL路径名,用于和基于域名的虚拟主机配合使用。

参见

top

ServerRoot 指令

说明安装服务器的基础目录
语法ServerRoot directory-path
默认值ServerRoot /usr/local/apache
作用域server config
状态核心(C)
模块core

ServerRoot指令设置了服务器所在的目录。一般来说它将包含conf/logs/子目录。其它配置文件的相对路径即基于此目录 (比如IncludeLoadModule)。

示例

ServerRoot /home/httpd

参见

top

ServerSignature 指令

说明配置服务器生成页面的页脚
语法ServerSignature On|Off|EMail
默认值ServerSignature Off
作用域server config, virtual host, directory, .htaccess
覆盖项All
状态核心(C)
模块core

ServerSignature指令允许您配置服务器端生成文档的页脚(错误信息、mod_proxy的ftp目录列表、mod_info的输出)。您启用这个页脚的原因主要在于处于一个代理服务器链中的时候,用户基本无法辨识出究竟是链中的哪个服务器真正产生了返回的错误信息。

默认的 Off 设置没有错误行(这样便与Apache1.2及更旧版本兼容)。采用 On 会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName ,而 EMail 设置会如文档中说明的那样额外创建一个指向ServerAdmin的"mailto:"部分。

对于2.0.44以后的版本,显示的详细服务器版本号将由ServerTokens指令控制。

参见

top

ServerTokens 指令

说明配置"Server:"应答头
语法ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
默认值ServerTokens Full
作用域server config
状态核心(C)
模块core

这个指令控制了服务器回应给客户端的"Server:"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息。

ServerTokens Prod[uctOnly]
服务器会发送(比如): Server: Apache
ServerTokens Major
服务器会发送(比如): Server: Apache/2
ServerTokens Minor
服务器会发送(比如): Server: Apache/2.0
ServerTokens Min[imal]
服务器会发送(比如): Server: Apache/2.0.41
ServerTokens OS
服务器会发送(比如): Server: Apache/2.0.41 (Unix)
ServerTokens Full (或未指定)
服务器会发送(比如): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

此设置将作用于整个服务器,而且不能用在虚拟主机的配置段中。

2.0.44版本以后,这个指令还控制着ServerSignature指令的显示内容。

参见

top

SetHandler 指令

说明强制所有匹配的文件被一个指定的处理器处理
语法SetHandler handler-name|None
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core
兼容性在Apache2.0中移入核心

当这个指令放入.htaccess<Directory><Location>配置段中时,这个指令将强制所有匹配的文件通过handler-name指定的处理器处理。比如:如果想不管某个目录中的文件具有什么扩展名,都将它作为图像映射规则文件来解析,您可以将下例放入那个目录的.htaccess中:

SetHandler imap-file

再来一个例子:如果您想当http://servername/status被请求时,服务器显示一个状态报告,您可以将下面的语句放入httpd.conf里面:

<Location /status>
SetHandler server-status
</Location>

你可以通过使用 None 来改写一个早先定义的SetHandler指令。

参见

top

SetInputFilter 指令

说明设置处理客户端请求和POST输入时使用的过滤器
语法SetInputFilter filter[;filter...]
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core

SetInputFilter指令为服务器接受并处理客户端请求和POST输入设置了过滤器。这是在其它地方(包括AddInputFilter指令)设置的过滤器以外附加的过滤器。

如果设置了多于一个过滤器,它们必须按照处理内容的顺序用分号(;)分隔。

参见

top

SetOutputFilter 指令

说明设置用于处理服务器输出应答的过滤器
语法SetOutputFilter filter[;filter...]
作用域server config, virtual host, directory, .htaccess
覆盖项FileInfo
状态核心(C)
模块core

SetOutputFilter指令设置了用于在服务器应答发送到客户端之前使用的过滤器。这是在其它地方(包括AddOutputFilter指令)设置的过滤器以外附加的过滤器。

例如:下述配置将会把/www/data/目录下的所有文件作为SSI文件来处理。

<Directory /www/data/>
SetOutputFilter INCLUDES
</Directory>

如果设置了多于一个过滤器,它们必须按照处理内容的顺序用分号(;)分隔。

参见

top

TimeOut 指令

说明服务器在断定请求失败前等待的秒数
语法TimeOut seconds
默认值TimeOut 300
作用域server config
状态核心(C)
模块core

TimeOut指令用于设置Apache等待以下三种事件的时间长度:

  1. 接受一个GET请求耗费的总时间。
  2. POST或PUT请求时,接受两个TCP包之间的时间。
  3. 应答时TCP包传输中两个ACK包之间的时间。

我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。

top

TraceEnable 指令

说明确定如何处理TRACE请求
语法TraceEnable [on|off|extended]
默认值TraceEnable on
作用域server config
状态核心(C)
模块core
兼容性仅在 Apache 1.3.34, 2.0.55 及以后的版本中可用

这个指令同时决定了核心和mod_proxy模块如何处理TRACE请求。默认(TraceEnable on)允许处理RFC2616定义的禁止附带任何请求体的TRACE请求。TraceEnable off 则使核心和mod_proxy模块向客户端返回一个"405"(禁止的方法)错误。

最后,为了测试和诊断,可以设置"TraceEnable extended"以允许附带请求体。核心(原始服务器)将会将请求体大小限制为64k以下(如果使用了 Transfer-Encoding: chunked 头,可以再为HTTP头增加8k)。核心会同时限制应答头和应答体;代理服务器则没有对请求体加以64k的限制。

top

UseCanonicalName 指令

说明配置服务器如何确定它自己的域名和端口
语法UseCanonicalName On|Off|DNS
默认值UseCanonicalName Off
作用域server config, virtual host, directory
状态核心(C)
模块core

在很多情况下,Apache必须构造一个自引用URL(即一个指回相同服务器的URL)。使用 UseCanonicalName On 会将ServerName这个域名用于所有自引用URL、SERVER_NAME、CGI中的SERVER_PORT

设置为 UseCanonicalName Off 时,如果客户端提供了主机名和端口(否则将如上所述使用标准域名),Apache将会使用这些信息来构建自引用URL。这些值与用于实现基于域名的虚拟主机的值相同,并且对于同样的客户端可用。CGI变量SERVER_NAMESERVER_PORT也会由客户端提供的值来构建。

用这样的方式成功解决问题的例子如下:在一个局域网内,您想让连接主机的用户使用诸如www这样的短域名进行访问。您会注意到,如果用户键入了类似http://www/splat这样的短域名和目录的URL,并且没有最后的斜线,Apache会将他们重定向到http://www.domain.com/splat/。如果您在这个目录上启用了身份验证,这会导致用户必须进行两次验证:一次针对www而另外一次针对www.domain.com(参见关于此主题的FAQ获得更多信息)。但如果UseCanonicalName设为 Off ,Apache就会重定向到http://www/splat/

第三个可选项是 UseCanonicalName DNS ,用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:"头的浏览器使用。使用这个选项时,Apache将对客户端连入的服务器的IP地址进行反向DNS查询,以构建自引用URL。

警告

如果CGI对SERVER_NAME的值作出了假定,它们会被此选项破坏。客户端对于给出它们想要的主机名这样的行动是完全不受限制的。但如果CGI仅使用SERVER_NAME来构建自引用的URL,它们会工作的很好。

参见

top

UseCanonicalPhysicalPort 指令

说明配置服务器如何确定自己的名字和端口
语法UseCanonicalPhysicalPort On|Off
默认值UseCanonicalPhysicalPort Off
作用域server config, virtual host, directory
状态核心(C)
模块core
兼容性仅在 Apache 2.2.0 及以后的版本中可用

在很多情况下,Apache必须构造一个自引用URL(即一个指回相同服务器的URL)。在 UseCanonicalPhysicalPort On 的时候,Apache将有可能在构造服务器的规范端口时为了符合UseCanonicalName指令而使用实际的物理端口号(physical port)。在 UseCanonicalPhysicalPort Off 的时候,Apache将不会使用实际的物理端口号,而是依赖所有已经配置的信息来构造一个合法的端口号。

注意

决定使用物理端口号的次序如下:

UseCanonicalName On

  • Servername指定的端口号
  • 物理端口号
  • 默认端口号
UseCanonicalName Off | DNS
  • "Host:"请求头提供的端口号
  • 物理端口号
  • Servername指定的端口号
  • 默认端口号

UseCanonicalPhysicalPort Off 的情况下,物理端口号将会从上述顺序中剔除。

参见

top

<VirtualHost> 指令

说明包含仅作用于指定主机名或IP地址的指令
语法<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
作用域server config
状态核心(C)
模块core

<VirtualHost></VirtualHost>用于封装一组仅作用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在<VirtualHost>配置段中的指令。Addr可以是:

  • 虚拟主机的IP地址
  • 虚拟主机IP地址对应的完整域名
  • 字符"*",仅与"NameVirtualHost *"配合使用以匹配所有的IP地址
  • 字符串"_default_",与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址

示例

<VirtualHost 10.1.2.3>
ServerAdmin [email protected]
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>

IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。一个IPv6的示例如下:

<VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
ServerAdmin [email protected]
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
</VirtualHost>

每个虚拟主机必须对应不同的IP地址、端口号或是不同的主机名。在第一种情况下,服务器所在的物理机器必须配置为可以为多个IP地址接受IP包。(在机器没有多个网络硬件界面的情况下,如果您的操作系统支持,您可以使用 ifconfig alias 命令来达到这个目的)。

注意

<VirtualHost>的使用并不影响Apache的监听地址。你需要使用Listen来确保Apache正在监听正确的地址。

当使用基于IP的虚拟主机时,特殊的名称"_default_"可以在没有匹配到其它列出的虚拟主机的情况下作为匹配任何IP地址的默认虚拟主机。在没有进行"_default_"虚拟主机的设定时,在没有IP与请求匹配的情况下,将使用"主服务器"(在所有虚拟主机配置段之外)的配置。但请注意:任何匹配NameVirtualHost指令的IP地址既不会使用"主服务器"配置,也不会使用"_default_"虚拟主机的配置。参见基于域名的虚拟主机文档。

您可以指定一个":port"来改变匹配的端口。如果没有指定,它将沿用主服务器中离它最近的那个Listen指定的值。您也可以指定":*"来匹配那个地址上的所有端口(当您使用"_default_"时,这是推荐采用的方法)。

安全

参见安全提示文档以获得为什么当您存储日志文件的目录对于启动服务器以外的用户来说是可写的会危及服务器安全的详细资料。

参见