ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# Apache核心(Core)特性 | [说明](#calibre_link-11) | Apache HTTP服务器核心提供的功能,始终有效 | | --- | --- | | [状态](#calibre_link-12) | 核心(C) | ## AcceptFilter 指令 | [说明](#calibre_link-18) | 根据协议类型对监听Socket进行优化 | | --- | --- | | [语法](#calibre_link-19) | `AcceptFilter protocol accept_filter` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 Apache 2.1.5 以后的版本中可用 | 这个指令使得操作系统根据协议类型对监听socket进行特别的优化。其基本前提是内核在数据接受完毕或一个完整的HTTP请求缓冲完成前不向服务器进程发送socket 。目前仅支持[FreeBSD的接收过滤器(Accept Filter)](http://www.freebsd.org/cgi/man.cgi?query=accept_filter&sektion=9)和Linux的更原始的(more primitive)`TCP_DEFER_ACCEPT` 。 FreeBSD上的默认值是: ``` AcceptFilter http httpready AcceptFilter https dataready ``` `httpready`接收过滤器(Accept Filter)在内核级别缓冲整个HTTP请求。一旦一个请求体被完整接收,内核将把它发送给服务器。参见[accf_http(9)](http://www.freebsd.org/cgi/man.cgi?query=accf_http&sektion=9)手册页以获得更详细的信息。因为HTTPS请求已经被加密了,所以只使用了[accf_data(9)](http://www.freebsd.org/cgi/man.cgi?query=accf_data&sektion=9)过滤器。 Linux上的默认值是: ``` AcceptFilter http data AcceptFilter https data ``` Linux的`TCP_DEFER_ACCEPT`并不支持对http请求进行缓冲。除`none`之外的任何值都将在监听程序上启用`TCP_DEFER_ACCEPT` 。参见[tcp(7)](http://homepages.cwi.nl/~aeb/linux/man2html/man7/tcp.7.html)手册页以获得更多详情。 使用`none`将会为那个协议禁用接收过滤器(accept filter)。这对于像`nntp`这样需要服务器先发送数据的协议很有用处: ``` AcceptFilter nttp none ``` ## AcceptPathInfo 指令 | [说明](#calibre_link-18) | 是否接受附带多余路径名信息的请求 | | --- | --- | | [语法](#calibre_link-19) | `AcceptPathInfo On&#124;Off&#124;Default` | | [默认值](#calibre_link-24) | `AcceptPathInfo Default` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 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` 是否接收附带多余路径名信息的请求由其对应的[处理器](#calibre_link-253)来决定。对应普通文本的核心处理器默认会拒绝`PATH_INFO` 。而用于伺服脚本的处理器,比如[cgi-script](#calibre_link-218)和[isapi-isa](#calibre_link-151),默认会接受`PATH_INFO` 。 `AcceptPathInfo`指令存在的首要目的就是允许您覆盖处理器关于是否接受`PATH_INFO`的默认设置。这种覆盖是很必要的。比如说,当您使用了类似[INCLUDES](#calibre_link-237)这样的[过滤器](#calibre_link-15)来根据`PATH_INFO`产生内容时。核心处理器通常会拒绝这样的请求,而您就可以用下述的配置使这样的脚本成为可能: ``` <Files "mypaths.shtml"> Options +Includes SetOutputFilter INCLUDES AcceptPathInfo On </Files> ``` ## AccessFileName 指令 | [说明](#calibre_link-18) | 分布式配置文件的名字 | | --- | --- | | [语法](#calibre_link-19) | `AccessFileName filename` | | [默认值](#calibre_link-24) | `AccessFileName .htaccess` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 如果[为某个目录启用了分布式配置文件功能](#calibre_link-322),那么在向客户端返回其中的文档时,服务器将在这个文档所在的各级目录中查找此配置文件。比如: ``` AccessFileName .acl ``` 在返回文档`/usr/local/web/index.html`之前,服务器会为此指令读取 `/.acl` 、`/usr/.acl` 、`/usr/local/.acl` 、`/usr/local/web/.acl` 除非此功能以被如下配置所禁用: ``` <Directory /> AllowOverride None </Directory> ``` ### 参见 * `AllowOverride` * [配置文件](#calibre_link-255) * [.htaccess 文件](#calibre_link-222) ## AddDefaultCharset 指令 | [说明](#calibre_link-18) | 当应答内容是`text/plain`或`text/html`时,在HTTP应答头中加入的默认字符集 | | --- | --- | | [语法](#calibre_link-19) | `AddDefaultCharset On&#124;Off&#124;charset` | | [默认值](#calibre_link-24) | `AddDefaultCharset Off` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 当且仅当应答内容是`text/plain`或`text/html`时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过`<meta>`标签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。`AddDefaultCharset Off` 将会禁用此功能。`AddDefaultCharset On` 将启用Apache内部的默认字符集`iso-8859-1` 。您也可以指定使用[在IANA注册过的字符集名字](http://www.iana.org/assignments/character-sets)中的另外一个charset 。比如说: ``` AddDefaultCharset utf-8 ``` `AddDefaultCharset`只应当在如下情况下使用:所有文本资源都使用同一种确定的字符集,且分别标记他们的字符集非常麻烦。一个这样的例子是向包含动态内容的资源中添加字符集参数(比如先前遗留的CGI脚本),这样可能会因为在输出中包含用户提供的数据而导致跨站点脚本攻击。但是请注意:更好的解决办法是修改或删除这些脚本,因为设置了默认的字符集以后将会使得浏览器的字符集自动探测功能失效。 ### 参见 * `AddCharset` ## AddOutputFilterByType 指令 | [说明](#calibre_link-18) | 对特定的MIME类型指定输出过滤器 | | --- | --- | | [语法](#calibre_link-19) | `AddOutputFilterByType filter[;filter...] MIME-type [MIME-type] ...` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | Apache 2.0.33 以后可用,但在Apache 2.1 以后反对使用 | 此指令根据应答的[MIME类型](#calibre_link-223 "see glossary")对请求激活特定的输出[过滤器](#calibre_link-15)。由于下面将要讨论的问题,我们反对使用这个指令。同样的功能可以通过使用`mod_filter`模块获得。 下例使用了由`mod_deflate`提供的`DEFLATE`过滤器。它将把所有以`text/html`或`text/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类型](#calibre_link-223 "see glossary")不能确定,那么将不会有过滤器加于其上,从而使之回到`DefaultType`的设置。甚至当`DefaultType`与其相同的时候也是这样。 然而,如果您想确认对某些资源相关的内容类型确实使用了过滤器,您可以使用用诸如`AddType`或`ForceType`这样的办法。在一个(non-nph)CGI脚本中设定内容类型也很安全。 由类型决定的输出过滤器永远不会作用于来自代理的请求。 ### 参见 * `AddOutputFilter` * `SetOutputFilter` * [过滤器](#calibre_link-15) ## AllowEncodedSlashes 指令 | [说明](#calibre_link-18) | 确定是否允许URL中使用经过编码的路径分割符 | | --- | --- | | [语法](#calibre_link-19) | `AllowEncodedSlashes On&#124;Off` | | [默认值](#calibre_link-24) | `AllowEncodedSlashes Off` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 Apache 2.0.46 及以后的版本中可用 | `AllowEncodedSlashes`指令允许使用包含经过编码的路径分割符的URL("`%2F`"→"`/`"或"`%5C`"→"`\`",取决于不同的系统)。默认情况下,这些URL将被一个包含"404"(未找到)错误的应答拒绝。 `AllowEncodedSlashes` `On` 通常和`PATH_INFO`配合使用。 ### 注意 允许使用经过编码的斜线(路径分割符)_并不意味着解码_。`%2F`或`%5C`(_仅仅_取决于不同的系统)将会按原样出现在解码后的URL字符串中。 ### 参见 * `AcceptPathInfo` ## AllowOverride 指令 | [说明](#calibre_link-18) | 确定允许存在于`.htaccess`文件中的指令类型 | | --- | --- | | [语法](#calibre_link-19) | `AllowOverride All&#124;None&#124;directive-type [directive-type] ...` | | [默认值](#calibre_link-24) | `AllowOverride All` | | [作用域](#calibre_link-20) | directory | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 当服务器发现一个`.htaccess`文件(由`AccessFileName`指定)时,它需要知道在这个文件中声明的哪些指令能覆盖在此之前指定的配置指令。 ### 仅允许存在于&lt;Directory&gt;配置段 `AllowOverride`仅在不包含正则表达式的`<Directory>`配置段中才是有效的。在`<Location>`, `<DirectoryMatch>`, `<Files>`配置段中都是无效的。 如果此指令被设置为`None` ,那么[.htaccess](#calibre_link-321)文件将被完全忽略。事实上,服务器根本不会读取`.htaccess`文件。 当此指令设置为 `All`时,所有具有".htaccess"[作用域](#calibre_link-20)的指令都允许出现在`.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,...] 允许使用控制指定目录功能的指令(`Options`和`XBitHack`)。可以在等号后面附加一个逗号分隔的(无空格的)`Options`选项列表,用来控制允许`Options`指令使用哪些选项。 例如以下指令只允许在`.htaccess`中使用`AuthConfig`和`Indexes`组的指令: ``` AllowOverride AuthConfig Indexes ``` 不在这两组中的指令将会导致服务器产生一个内部错误。 ### 参见 * `AccessFileName` * [配置文件](#calibre_link-255) * [.htaccess文件](#calibre_link-222) ## AuthName 指令 | [说明](#calibre_link-18) | 用于HTTP认证的授权域 | | --- | --- | | [语法](#calibre_link-19) | `AuthName auth-domain` | | [作用域](#calibre_link-20) | directory, .htaccess | | [覆盖项](#calibre_link-66) | AuthConfig | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 此指令为目录的授权域设置名字。此域将发送给客户端以使用户了解应当发送哪个用户名和密码。`AuthName`指令带有一个参数。如果域的名字中包含空格,则必须用引号引起来。它必须与`AuthType`和`Require`指令以及诸如`AuthUserFile`和`AuthGroupFile`这样的指令一起工作。 例如: ``` AuthName "Top Secret" ``` 提供给`AuthName`的字符串将出现在大多数浏览器提供的密码对话框中。 ### 参见 * [认证、授权、访问控制](#calibre_link-266) ## AuthType 指令 | [说明](#calibre_link-18) | 用户认证类型 | | --- | --- | | [语法](#calibre_link-19) | `AuthType Basic&#124;Digest` | | [作用域](#calibre_link-20) | directory, .htaccess | | [覆盖项](#calibre_link-66) | AuthConfig | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 此指令选择了一个目录的用户认证类型。目前只实现了`Basic`(`mod_auth_basic`)和`Digest`(`mod_auth_digest`)。 要实现认证,还必须同时与`AuthName`和`Require`指令一起使用。另外,服务器还必须包含一个认证支持模块(比如`mod_authn_file`)和一个授权支持模块(比如`mod_authz_user`)。 ### 参见 * [认证、授权、访问控制](#calibre_link-266) ## CGIMapExtension 指令 | [说明](#calibre_link-18) | 定位CGI脚本解释器 | | --- | --- | | [语法](#calibre_link-19) | `CGIMapExtension cgi-path .extension` | | [作用域](#calibre_link-20) | directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | NetWare only | 此指令用于定位Apache CGI脚本解释器。比如,"`CGIMapExtension sys:\foo.nlm .foo`"将把所有具有`.foo`后缀的CGI脚本文件传递给FOO解释器。 ## ContentDigest 指令 | [说明](#calibre_link-18) | 允许生成`Content-MD5`应答头 | | --- | --- | | [语法](#calibre_link-19) | `ContentDigest On&#124;Off` | | [默认值](#calibre_link-24) | `ContentDigest Off` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | Options | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 此指令遵照RFC1854和RFC2068协议的定义启用了`Content-MD5`应答头的生成。 MD5是一种为不定长度的数据计算出一个"消息摘要"(有时也称为"指纹")的算法。并且保证数据中的任何变化都会反应在消息摘要的变化中。 `Content-MD5`头提供了一种端到端的针对整个消息体的信息完整性检查方法。代理或者客户端会检查此头以侦测在传输过程中,消息体是否产生了意外的改变。一个头的例子如下: ``` Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA== ``` 请注意,因为对每个请求都要进行消息摘要的运算(没有对其值进行缓存),所以这会对您的服务器造成性能方面的影响。 `Content-MD5`仅为由`Apache核心`伺服的文档进行发送,而对于由模块处理的文档则不予理会。比如说SSI文档、CGI脚本的输出、字节范围的应答都不包括这个头。 ## DefaultType 指令 | [说明](#calibre_link-18) | 在服务器无法由其他方法确定内容类型时,发送的默认MIME内容类型 | | --- | --- | | [语法](#calibre_link-19) | `DefaultType MIME-type` | | [默认值](#calibre_link-24) | `DefaultType text/plain` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 有时会发生这样的事:服务器会被要求提供一个文档,而这个文档的类型无法由它的[MIME类型](#calibre_link-223 "see glossary")映射所决定。 服务器必须通知客户端其文档的内容类型。所以当一个未知类型出现时,将会使用`DefaultType` 。例如: ``` DefaultType image/gif ``` 这样的配置对于里面有很多gif图片而有些在文件名中缺少`.gif`扩展名的目录非常合适。 注意,与`ForceType`指令的不同之处在于:此指令仅提供了默认的mime类型。所有其它mime类型的定义,包括文件的扩展名,或其它可以标识媒体类型的方法都会覆盖此默认值。 ## &lt;Directory&gt; 指令 | [说明](#calibre_link-18) | 封装一组指令,使之仅对文件空间中的某个目录及其子目录生效 | | --- | --- | | [语法](#calibre_link-19) | `<Directory directory-path&gt; ... &lt;/Directory>` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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>`的指令将无法对通过不同路径指向的同一个目录文件生效,比如说通过另外一个符号连接生成的路径。 扩展的[正则表达式](#calibre_link-67 "see glossary")也可以通过附加一个"`~`"字符来使用。比如说: ``` <Directory ~ "^/www/(.+/)*[0-9]{3}"> ``` 将匹配`/www/`下所有由3个数字组成的目录。 如果有多个(非正则表达式)`<Directory>`配置段符合包含某文档的目录(或其父目录),那么指令将以短目录优先的规则进行应用。并包含[.htaccess](#calibre_link-321)文件中的指令。比如说在 ``` <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> ``` **然后在您_想要_使之被访问的目录中覆盖此配置。参阅[安全提示](#calibre_link-263)以获取更多详情。** 一般来说`<Directory>`指令只会出现在`httpd.conf`文件中,但它们也可能出现在任何其它配置文件中。`<Directory>`指令不可被嵌套使用,也不能出现在`<Limit>`或`<LimitExcept>`配置段中。 ### 参见 * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。 ## &lt;DirectoryMatch&gt; 指令 | [说明](#calibre_link-18) | 封装一些指令并作用于文件系统中匹配正则表达式的所有目录及其子目录 | | --- | --- | | [语法](#calibre_link-19) | `<DirectoryMatch regex&gt; ... &lt;/DirectoryMatch>` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<DirectoryMatch>`和`</DirectoryMatch>`用于封装一组指令。与`<Directory>`类似,此指令将仅作用于指定名字的目录及其子目录。然而,它可以接受一个[正则表达式](#calibre_link-67 "see glossary")作为参数。比如说: ``` <DirectoryMatch "^/www/(.+/)*[0-9]{3}"> ``` 将匹配`/www/`下所有由3个数字组成的目录。 ### 参见 * `<Directory>`获取如何在普通的`<Directory>`中使用正则表达式的描述。 * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。 ## DocumentRoot 指令 | [说明](#calibre_link-18) | 组成网络上可见的主文档树的根目录 | | --- | --- | | [语法](#calibre_link-19) | `DocumentRoot directory-path` | | [默认值](#calibre_link-24) | `DocumentRoot /usr/local/apache2/htdocs` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 此指令设置了`httpd`伺服的目录。在没有使用类似`Alias`这样的指令的情况下,服务器会将请求中的URL附加到`DocumentRoot`后面以构成指向文档的路径。比如说: ``` DocumentRoot /usr/web ``` 于是对`http://www.my.host.com/index.html`的访问就会指向`/usr/web/index.html` 。如果directory-path不是绝对路径,则被假定为是相对于`ServerRoot`的路径。 指定`DocumentRoot`时不应包括最后的"/"。 ### 参见 * [从URL到文件系统的映射](#calibre_link-261) ## EnableMMAP 指令 | [说明](#calibre_link-18) | 在递送中使用内存映射(memory-mapping)来读取文件 | | --- | --- | | [语法](#calibre_link-19) | `EnableMMAP On&#124;Off` | | [默认值](#calibre_link-24) | `EnableMMAP On` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 此指令指示`httpd`在递送中如果需要读取一个文件的内容,它是否可以使用内存映射。当处理一个需要访问文件中的数据的请求时,比如说当递送一个使用`mod_include`进行服务器端分析的文件时,如果操作系统支持,Apache将默认使用内存映射。 这种内存映射有时会带来性能的提高,但在某些情况下,您可能会需要禁用内存映射以避免一些操作系统的问题: * 在一些多处理器的系统上,内存映射会减低一些`httpd`的性能。 * 在挂载了NFS的`DocumentRoot`上,若已经将一个文件进行了内存映射,则删除或截断这个文件会造成`httpd`因为分段故障而崩溃。 在可能遇到这些问题的服务器配置过程中,您应当使用下面的命令来禁用内存映射: ``` EnableMMAP Off ``` 对于挂载了NFS的文件夹,可以单独指定禁用内存映射: ``` <Directory "/path-to-nfs-files"> EnableMMAP Off </Directory> ``` ## EnableSendfile 指令 | [说明](#calibre_link-18) | 使用操作系统内核的sendfile支持来将文件发送到客户端 | | --- | --- | | [语法](#calibre_link-19) | `EnableSendfile On&#124;Off` | | [默认值](#calibre_link-24) | `EnableSendfile On` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 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> ``` ## ErrorDocument 指令 | [说明](#calibre_link-18) | 当遇到错误的时候服务器将给客户端什么样的应答 | | --- | --- | | [语法](#calibre_link-19) | `ErrorDocument error-code document` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 在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](http://support.microsoft.com/default.aspx?scid=kb;en-us;Q294807)中获取更多信息。 虽然大多数错误信息可以被改写,但是在有些情况下,将仍然使用某些内置的错误信息而不管`ErrorDocument`如何设置。特别是在检测到一个"畸形"请求的情况下,正常的请求处理过程将会被立即中断,并且立即返回一个内置的错误信息。这是为了防止某些不良请求可能导致的安全问题。 在2.0版以前,信息前面会用一个不配对的双引号作为前导标志。 ### 参见 * [定制个性化应答文档](#calibre_link-521) ## ErrorLog 指令 | [说明](#calibre_link-18) | 存放错误日志的位置 | | --- | --- | | [语法](#calibre_link-19) | `ErrorLog file-path&#124;syslog[:facility]` | | [默认值](#calibre_link-24) | `ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows 和 OS/2)` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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 ``` _安全提示_:参阅[安全提示](#calibre_link-281)文档获得关于为什么当记录日志文件的目录对于启动服务器以外的用户可写时会对您的服务器构成安全威胁。 ### 注意 当在非Unix平台上输入文件路径的时候,路径分隔符必须统一使用正斜线(/),即使那个平台本身使用反斜线(\)。 ### 参见 * `LogLevel` * [Apache日志文件](#calibre_link-260) ## FileETag 指令 | [说明](#calibre_link-18) | 用以创建ETag应答头的文件的属性 | | --- | --- | | [语法](#calibre_link-19) | `FileETag component ...` | | [默认值](#calibre_link-24) | `FileETag INode MTime Size` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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`"。 ## &lt;Files&gt; 指令 | [说明](#calibre_link-18) | 包含作用于匹配指定文件名的指令 | | --- | --- | | [语法](#calibre_link-19) | `<Files filename&gt; ... &lt;/Files>` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<Files>`指令提供了基于文件名的访问控制,类似于`<Directory>`和`<Location>`指令。它将配对一个`</Files>`指令。在此配置段中定义的指令将作用于其基本名称(不是完整的路径)与指定的文件名相符的对象。`<Files>`段将根据它们在配置文件中出现的顺序被处理:在`<Directory>`段和`.htaccess`文件被处理之后,但在`<Location>`段之前。请注意:`<Files>`能嵌入到`<Directory>`段中以限制它们作用的文件系统范围。 filename参数应当是一个文件名或是一个包含通配符的字符串,其中"`?`"匹配任何单个字符,"`*`"匹配任何字符串序列。在"`~`"字符之后同样可以使用[正则表达式](#calibre_link-67 "see glossary")。比如: ``` <Files ~ "\.(gif|jpe?g|png)$"> ``` 将匹配绝大部分常见的因特网图象格式。然而在Apache1.3及其后继版本中,更推荐使用`<FilesMatch>`指令。 请注意与`<Directory>`和`<Location>`配置段不同的是:`<Files>`配置段可用于`.htaccess`文件当中。这将允许用户在文件层面上控制对它们自己文件的访问。 ### 参见 * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。 ## &lt;FilesMatch&gt; 指令 | [说明](#calibre_link-18) | 包含作用于与正则表达式匹配的文件名的指令 | | --- | --- | | [语法](#calibre_link-19) | `<FilesMatch regex&gt; ... &lt;/FilesMatch>` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<FilesMatch>`指令就像`<Files>`指令一样提供了针对文件名的访问控制。然而,它使用的是[正则表达式](#calibre_link-67 "see glossary")。比如说: ``` <FilesMatch "\.(gif|jpe?g|png)$"> ``` 将匹配最常见的internet图形文件格式。 ### 参见 * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。 ## ForceType 指令 | [说明](#calibre_link-18) | 强制所有匹配的文件被作为指定的MIME类型进行伺服 | | --- | --- | | [语法](#calibre_link-19) | `ForceType MIME-type&#124;None` | | [作用域](#calibre_link-20) | directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 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> ``` ## HostnameLookups 指令 | [说明](#calibre_link-18) | 启用对客户端IP的DNS查找 | | --- | --- | | [语法](#calibre_link-19) | `HostnameLookups On&#124;Off&#124;Double` | | [默认值](#calibre_link-24) | `HostnameLookups Off` | | [作用域](#calibre_link-20) | server config, virtual host, directory | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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地址进行主机名的查询。 ## &lt;IfDefine&gt; 指令 | [说明](#calibre_link-18) | 封装一组只有在启动时当测试结果为真时才生效的指令 | | --- | --- | | [语法](#calibre_link-19) | `<IfDefine [!]parameter-name&gt; ... &lt;/IfDefine>` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<IfDefine test&gt;...&lt;/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> ``` ## &lt;IfModule&gt; 指令 | [说明](#calibre_link-18) | 封装指令并根据指定的模块是否启用为条件而决定是否进行处理 | | --- | --- | | [语法](#calibre_link-19) | `<IfModule [!]module-file&#124;module-identifier&gt; ... &lt;/IfModule>` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | module-identifier仅在 Apache 2.1 及以后的版本中可用 | `<IfModule test&gt;...&lt;/IfModule>`配置段用于封装根据指定的模块是否启用而决定是否生效的指令。在`<IfModule>`配置段中的指令仅当test为真的时候才进行处理。如果test为假,所有其间的指令都将被忽略。 `<IfModule>`段中的test可以为以下两种方式之一: * module * !module 在第一种情况下,起始和结束标记之间的指令仅当module被载入后才被执行。此模块可以为编译时静态链接进核心的模块或是使用`LoadModule`指令动态载入的模块。第二种情况则相反,仅当module**没有**载入时才进行指令的处理。 module可以是模块的标识符或者是编译模块时的文件名。比如,`rewrite_module`就是一个模块标识符,而`mod_rewrite.c`则是编译模块时的文件名。如果模块包含多个源代码文件,您应当使用包含`STANDARD20_MODULE_STUFF`字符串的那个。 `<IfModule>`配置段是可以嵌套的,从而可以实现简单的多模块测试。 此配置段主要用于需要根据某个特定的模块是否存在来决定是否使用某些配置的时候。指令一般都放在`<IfModule>`配置段中。 ## Include 指令 | [说明](#calibre_link-18) | 在服务器配置文件中包含其它配置文件 | | --- | --- | | [语法](#calibre_link-19) | `Include file-path&#124;directory-path` | | [作用域](#calibre_link-20) | server config, virtual host, directory | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 通配符仅在 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 ``` ### 参见 * `apachectl` ## KeepAlive 指令 | [说明](#calibre_link-18) | 启用HTTP持久链接 | | --- | --- | | [语法](#calibre_link-19) | `KeepAlive On&#124;Off` | | [默认值](#calibre_link-24) | `KeepAlive On` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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的客户端来说,如果没有进行特殊指定,持久将是默认的连接方式。如果客户端进行了请求,将使用分块编码以解决在持久链接里发送未知长度内容的问题。 ### 参见 * `MaxKeepAliveRequests` ## KeepAliveTimeout 指令 | [说明](#calibre_link-18) | 持久链接中服务器在两次请求之间等待的秒数 | | --- | --- | | [语法](#calibre_link-19) | `KeepAliveTimeout seconds` | | [默认值](#calibre_link-24) | `KeepAliveTimeout 5` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | Apache在关闭持久连接前等待下一个请求的秒数。一旦收到一个请求,超时值将会被设置为`Timeout`指令指定的秒数。 对于高负荷服务器来说,`KeepAliveTimeout`值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。 ## &lt;Limit&gt; 指令 | [说明](#calibre_link-18) | 仅对指定的HTTP方法进行访问控制 | | --- | --- | | [语法](#calibre_link-19) | `<Limit method [method] ... &gt; ... &lt;/Limit>` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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方法。 ## &lt;LimitExcept&gt; 指令 | [说明](#calibre_link-18) | 对除了指定方法以外的所有HTTP方法进行访问控制 | | --- | --- | | [语法](#calibre_link-19) | `<LimitExcept method [method] ... &gt; ... &lt;/LimitExcept>` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<LimitExcept>`和`</LimitExcept>`用于封装一组访问控制指令,并将其作用于所有**没有**在参数中标出的HTTP方法。也就是说,与`<Limit>`相反,它用于控制标准的和非标准以及无法辨识的方法。 比如: ``` <LimitExcept POST GET> Require valid-user </LimitExcept> ``` ## LimitInternalRecursion 指令 | [说明](#calibre_link-18) | 指定内部重定向和嵌套子请求的最大数量 | | --- | --- | | [语法](#calibre_link-19) | `LimitInternalRecursion number [number]` | | [默认值](#calibre_link-24) | `LimitInternalRecursion 10` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 Apache 2.0.47 及以后的版本中可用 | 例如,当使用`Action`指令内部重定向原始请求到一个CGI脚本时,一个内部重定向将会发生。子请求是Apache的一个用于找到如果一个URI被请求时将会发生什么的机制。例如,`mod_dir`使用子请求来寻找那些根据`DirectoryIndex`指令应当被列出的文件。 `LimitInternalRecursion`可以防止服务器进入一个内部重定向或者子请求的死循环而崩溃。这样的死循环通常由错误的配置引起。 这个指令存储了两个不同的限制,这两个限制是基于每个单独的请求进行计算的。第一个number限制了内部重定向链的最大长度(一个接一个)。第二个number限制了子请求的最大嵌套层数。如果你只指定了一个number ,那么将会被同时应用于这两个限制。 ### 示例 ``` LimitInternalRecursion 5 ``` ## LimitRequestBody 指令 | [说明](#calibre_link-18) | 限制客户端发送的HTTP请求体的最大字节长度 | | --- | --- | | [语法](#calibre_link-19) | `LimitRequestBody bytes` | | [默认值](#calibre_link-24) | `LimitRequestBody 0` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | bytes在0(意味着无限制)到2147483647(2GB)间限制了请求体所允许的字节数。 `LimitRequestBody`可以让用户在其作用范围内(整个服务器、特定目录、特定文件、特定位置)设置一个允许客户端发送的HTTP请求体的最大字节长度的限制。如果客户端的请求超出了这个限制,服务器会回应一个错误而不是伺服这个请求。一个普通请求的信息体在很大程度上取决于资源的自然属性和这个资源允许的方法。CGI脚本经常用消息体把表单的信息传递给服务器。使用`PUT`方法至少会需要与服务器期望从这个资源得到的信息量差不多大小的值。 此指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。 比如,如果您允许文件上传到某个位置,而且希望能将上传文件的大小设置为100K,您可以使用下面的指令: ``` LimitRequestBody 102400 ``` ## LimitRequestFields 指令 | [说明](#calibre_link-18) | 限制接受客户端请求中HTTP请求头域的数量 | | --- | --- | | [语法](#calibre_link-19) | `LimitRequestFields number` | | [默认值](#calibre_link-24) | `LimitRequestFields 100` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | Number是一个0(意味着不限)到32767之间的整数。默认值为编译时的常量`DEFAULT_LIMIT_REQUEST_FIELDS`(发布值为100)。 `LimitRequestFields`指令允许服务器管理员修改在一个HTTP请求中的请求头域的数量限制。服务器需要此值大于一个普通客户端请求中包含头域的数量。一个客户端请求头域的数量很少大于20,但根据客户端的不同这个数字有很大的差别,经常取决于用户配置他们的浏览器扩展以支持更详细的内容协商。可选的HTTP扩展经常使用请求头域来实现。 这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。如果正常使用的客户端得到了服务器的错误应答,指出其在请求中发送了过多的头域,您应该适当的增大此值。 例如: ``` LimitRequestFields 50 ``` ## LimitRequestFieldSize 指令 | [说明](#calibre_link-18) | 限制客户端发送的请求头的字节数 | | --- | --- | | [语法](#calibre_link-19) | `LimitRequestFieldsize bytes` | | [默认值](#calibre_link-24) | `LimitRequestFieldsize 8190` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | bytes指定了HTTP请求头允许的字节大小。 `LimitRequestFieldSize`指令允许服务器管理员增加或减少HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。SPNEGO的认证头最大可能达到12392字节。 这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。 举例如下: ``` LimitRequestFieldSize 4094 ``` 一般情况下,请不要改变这个设置,而是保持其默认设置。 ## LimitRequestLine 指令 | [说明](#calibre_link-18) | 限制接受客户端发送的HTTP请求行的字节数 | | --- | --- | | [语法](#calibre_link-19) | `LimitRequestLine bytes` | | [默认值](#calibre_link-24) | `LimitRequestLine 8190` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | bytes将设置HTTP请求行的字节数限制。 `LimitRequestLine`指令允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI、协议版本,所以`LimitRequestLine`指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在`GET`请求中所传递的查询部分的所有信息。 这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。 举例如下: ``` LimitRequestLine 4094 ``` 一般情况下,不需要改变此设置的默认值。 ## LimitXMLRequestBody 指令 | [说明](#calibre_link-18) | 限制基于XML的请求体的大小 | | --- | --- | | [语法](#calibre_link-19) | `LimitXMLRequestBody bytes` | | [默认值](#calibre_link-24) | `LimitXMLRequestBody 1000000` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 限制基于XML的请求体大小的最大字节数,"`0`"将禁用这一检查。 比如: ``` LimitXMLRequestBody 0 ``` ## &lt;Location&gt; 指令 | [说明](#calibre_link-18) | 将封装的指令作用于匹配的URL | | --- | --- | | [语法](#calibre_link-19) | `<Location URL-path&#124;URL&gt; ... &lt;/Location>` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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可以用一个通配符字符串来进行通配符的处理。"`?`"匹配任何单个的字符,而"`*`"匹配所有字符序列。 也可以附加"`~`"字符来表示使用[正则表达式](#calibre_link-67 "see glossary")。例如: ``` <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`"的,那么它们就是匹配的。 ### 参见 * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。 ## &lt;LocationMatch&gt; 指令 | [说明](#calibre_link-18) | 将封装的指令作用于正则表达式匹配的URL | | --- | --- | | [语法](#calibre_link-19) | `<LocationMatch regex&gt; ... &lt;/LocationMatch>` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<LocationMatch>`和`<Location>`指令相同,提供了基于URL的访问控制。但它使用[正则表达式](#calibre_link-67 "see glossary")作为参数,而不是简单字符串。比如: ``` <LocationMatch "/(extra|special)/data"> ``` 将匹配包含子串"`/extra/data`"或"`/special/data`"的URL。 ### 参见 * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。 ## LogLevel 指令 | [说明](#calibre_link-18) | 控制错误日志的详细程度 | | --- | --- | | [语法](#calibre_link-19) | `LogLevel level` | | [默认值](#calibre_link-24) | `LogLevel warn` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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` ,则所有`notice`和`warn`级别的信息也会被记录。 建议至少使用`crit`级别。 示例如下: ``` LogLevel notice ``` ### 注意 当错误日志是一个单独分开的正式文件的时候,`notice`级别的消息总是会被记录下来,而不能被屏蔽。但是,当使用`syslog`来记录时就没有这个问题。 ## MaxKeepAliveRequests 指令 | [说明](#calibre_link-18) | 一个持久链接中允许的最大请求数量 | | --- | --- | | [语法](#calibre_link-19) | `MaxKeepAliveRequests number` | | [默认值](#calibre_link-24) | `MaxKeepAliveRequests 100` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `MaxKeepAliveRequests`指令限制了当启用`KeepAlive`时,每个连接允许的请求数量。如果将此值设为"`0`",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。 例如: ``` MaxKeepAliveRequests 500 ``` ## NameVirtualHost 指令 | [说明](#calibre_link-18) | 为一个基于域名的虚拟主机指定一个IP地址(和端口) | | --- | --- | | [语法](#calibre_link-19) | `NameVirtualHost addr[:port]` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 如果您要配置[基于域名的虚拟主机](#calibre_link-36),`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> ``` ### 参见 * [虚拟主机文档](#calibre_link-36) ## Options 指令 | [说明](#calibre_link-18) | 配置在特定目录中可以使用哪些特性 | | --- | --- | | [语法](#calibre_link-19) | `Options [+&#124;-]option [[+&#124;-]option] ...` | | [默认值](#calibre_link-24) | `Options All` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | Options | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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`提供[内容协商](#calibre_link-258)的"多重视图"(MultiViews)。 `SymLinksIfOwnerMatch` 服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。 ### 注意 如果此配置出现在`<Location>`配置段中,此选项将被忽略。 一般来说,如果一个目录被多次设置了`Options` ,则最特殊的一个会被完全接受(其它的被忽略),而各个可选项的设定彼此并不融合(参见[配置段的合并](#calibre_link-452))。然而,如果_所有_作用于`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> ``` 那么就会有`FollowSymLinks`和`Includes`设置到`/web/docs/spec`目录上。 ### 注意 使用 `-IncludesNOEXEC` 或 `-Includes` 时,不论前面如何设置,都会完全禁用服务器端包含。 没有其它设置时,默认设置为 `All` 。 ## Require 指令 | [说明](#calibre_link-18) | 指定哪些认证用户允许访问该资源 | | --- | --- | | [语法](#calibre_link-19) | `Require entity-name [entity-name] ...` | | [作用域](#calibre_link-20) | directory, .htaccess | | [覆盖项](#calibre_link-66) | AuthConfig | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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`必须伴随`AuthName`和`AuthType`指令,以及诸如`AuthUserFile`和`AuthGroupFile`指令(用以定义用户和用户组)以确保其能够正确工作。例如: ``` AuthType Basic AuthName "Restricted Resource" AuthUserFile /web/users AuthGroupFile /web/groups Require group admin ``` 使用这种方法提供的访问控制对**所有**方法都有效。**这是一般情况下期望达到的效果**。如果您仅希望对某个特定的方法加以限制,而不涉及其它方法时,您可以将`Require`语句放入`<Limit>`配置段中。 如果`Require`与`Allow`或`Deny`指令同时使用,那么这些指令之间的相互作用由`Satisfy`指令控制。 ### 在子目录中删除访问控制 下面的例子展示了如何使用`Satisfy`指令在一个受保护的目录下的子目录中取消访问控制。使用这种方法必须十分小心,因为它取消了`mod_authz_host`实现的任何访问控制。 ``` <Directory /path/to/protected/> Require user david </Directory> <Directory /path/to/protected/unprotected> # 该目录下的所有认证和访问控制都被取消了 Satisfy Any Allow from all </Directory> ``` ### 参见 * [认证、授权、访问控制](#calibre_link-266) * `Satisfy` * `mod_authz_host` ## RLimitCPU 指令 | [说明](#calibre_link-18) | 限制Apache子进程派生的进程占用CPU的最大秒数 | | --- | --- | | [语法](#calibre_link-19) | `RLimitCPU seconds&#124;max [seconds&#124;max]` | | [默认值](#calibre_link-24) | `未定义,使用操作系统默认值` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"`max`"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以`root`运行服务器或是在初始化启动语句中进行设置。 这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。 CPU资源限制表示为每进程占用的秒数。 ### 参见 * `RLimitMEM` * `RLimitNPROC` ## RLimitMEM 指令 | [说明](#calibre_link-18) | 限制由Apache子进程派生的进程占用的最大内存字节数 | | --- | --- | | [语法](#calibre_link-19) | `RLimitMEM bytes&#124;max [bytes&#124;max]` | | [默认值](#calibre_link-24) | `未定义,使用操作系统默认值` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"`max`"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以`root`运行服务器或是在初始化启动语句中进行设置。 这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。 内存资源限制表示为每进程占用的字节数。 ### 参见 * `RLimitCPU` * `RLimitNPROC` ## RLimitNPROC 指令 | [说明](#calibre_link-18) | 限制由Apache子进程派生的进程所派生的进程数目 | | --- | --- | | [语法](#calibre_link-19) | `RLimitNPROC number&#124;max [number&#124;max]` | | [默认值](#calibre_link-24) | `未定义,使用操作系统默认值` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"`max`"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以`root`运行服务器或是在初始化启动语句中进行设置。 这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。 进程限制控制了每个用户的进程数。 ### 注意 如果CGI进程**不是**以web服务器的uid启动的,那么这个指令将限制服务器自己能够创建的进程数目。此种情况将在`error_log`中以"**`cannot fork`**"进行记录。 ### 参见 * `RLimitMEM` * `RLimitCPU` ## Satisfy 指令 | [说明](#calibre_link-18) | 主机级别的访问控制和用户认证之间的相互关系 | | --- | --- | | [语法](#calibre_link-19) | `Satisfy Any&#124;All` | | [默认值](#calibre_link-24) | `Satisfy All` | | [作用域](#calibre_link-20) | directory, .htaccess | | [覆盖项](#calibre_link-66) | AuthConfig | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 2.0.51及以后版本中受`<Limit>`和`<LimitExcept>`指令影响 | 同时使用`Allow`和`Require`时的访问策略。参数可以设置为 `All` 或 `Any` 。这个指令仅在某个特定区域的访问控制同时被用户名/密码_和_客户端主机地址进行限定的时候起作用。默认行为(`All`)采取客户端首先通过地址访问限制_并且_输入有效的用户名和密码的方式。使用可选项 `Any` 将使客户端在通过主机限制或是输入一个有效的用户名和密码两种方式之一得到访问权限。这样,就可以通过密码来限制一个区域的访问,但允许某些特定地址的客户端访问时不需要输入密码。 比如,如果您想让您局域网内的用户访问您的web网站时不受限制,但局域网外的用户需提供密码才能进行访问,您可以采取类似如下的配置: ``` Require valid-user Allow from 192.168.1 Satisfy Any ``` 从2.0.51版本开始,`Satisfy`指令可以被限定于由`<Limit>`和`<LimitExcept>`配置段指定的特定的方法。 ### 参见 * `Allow` * `Require` ## ScriptInterpreterSource 指令 | [说明](#calibre_link-18) | 定位CGI脚本解释器 | | --- | --- | | [语法](#calibre_link-19) | `ScriptInterpreterSource Registry&#124;Registry-Strict&#124;Script` | | [默认值](#calibre_link-24) | `ScriptInterpreterSource Script` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅用于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\Command`或`Shell\Open\Command`定义(如果前者不存在)。如果无法找到该注册表项,Apache将采用默认值:`Script` 。 ### 安全 将 `ScriptInterpreterSource Registry` 和使用了`ScriptAlias`的目录一起使用时需要非常小心,因为Apache会执行这个目录下的**所有**文件。`Registry`设置可能会导致对不可执行文件的不期望的程序调用。例如,在大多数Windows上默认打开`.htm`文件的程序是IE,所以任何一个对脚本目录中`.htm`文件的请求将会在服务器后台打开一个IE。这是一个让你的服务器在数分钟内崩溃的好办法。 `Registry-Strict`选项和`Registry`差不多,但是只使用`Shell\ExecCGI\Command`子键。`ExecCGI`键不是一个普通的键。它必须在注册表中手动配置,从而可以防止意外的程序调用。 ## ServerAdmin 指令 | [说明](#calibre_link-18) | 服务器返回给客户端的错误信息中包含的管理员邮件地址 | | --- | --- | | [语法](#calibre_link-19) | `ServerAdmin email-address&#124;URL` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `ServerAdmin`设置了在所有返回给客户端的错误信息中包含的管理员邮件地址。如果`httpd`不能将提供的参数识别为URL,它就会假定它是一个email-address ,并在超连接中用在`mailto:`后面。推荐使用一个Email地址,因为许多CGI脚本是这样认为的。如果你确实想使用URL,一定要保证指向一个你能够控制的服务器,否则用户将无法确保一定可以和你取得联系。 为这个目的专门设置一个邮箱是值得的,比如: ``` ServerAdmin www-admin@foo.example.com ``` 因为用户一般不会注意到他们在讨论服务器的问题! ## ServerAlias 指令 | [说明](#calibre_link-18) | 匹配一个基于域名的虚拟主机的别名 | | --- | --- | | [语法](#calibre_link-19) | `ServerAlias hostname [hostname] ...` | | [作用域](#calibre_link-20) | virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `ServerAlias`指令设定主机的别名,用于[基于域名的虚拟主机](#calibre_link-75)。 ``` <VirtualHost *> ServerName server.domain.com ServerAlias server server2.domain.com server2 # ... </VirtualHost> ``` ### 参见 * [Apache虚拟主机文档](#calibre_link-36) ## ServerName 指令 | [说明](#calibre_link-18) | 服务器用于辨识自己的主机名和端口号 | | --- | --- | | [语法](#calibre_link-19) | `ServerName fully-qualified-domain-name[:port]` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 在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`显式的指定一个主机名和端口号。 如果使用的是[基于域名的虚拟主机](#calibre_link-75),在`<VirtualHost>`段中的`ServerName`将是为了匹配这个虚拟主机,在"`Host:`"请求头中必须出现的主机名。 参见`UseCanonicalName`和`UseCanonicalPhysicalPort`指令以获得关于自引用URL(比如使用`mod_dir`模块)是需要指定一个特定端口,还是使用客户端请求的端口号的更详细的信息。 ### 参见 * [关于DNS和Apache](#calibre_link-55) * [Apache虚拟主机文档](#calibre_link-36) * `UseCanonicalName` * `UseCanonicalPhysicalPort` * `NameVirtualHost` * `ServerAlias` ## ServerPath 指令 | [说明](#calibre_link-18) | 为兼容性不好的浏览器访问基于域名的虚拟主机保留的URL路径名 | | --- | --- | | [语法](#calibre_link-19) | `ServerPath URL-path` | | [作用域](#calibre_link-20) | virtual host | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `ServerPath`指令为主机设置了保守的(legacy)URL路径名,用于和[基于域名的虚拟主机](#calibre_link-36)配合使用。 ### 参见 * [Apache虚拟主机文档](#calibre_link-36) ## ServerRoot 指令 | [说明](#calibre_link-18) | 安装服务器的基础目录 | | --- | --- | | [语法](#calibre_link-19) | `ServerRoot directory-path` | | [默认值](#calibre_link-24) | `ServerRoot /usr/local/apache` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `ServerRoot`指令设置了服务器所在的目录。一般来说它将包含`conf/`和`logs/`子目录。其它配置文件的相对路径即基于此目录 (比如`Include`或`LoadModule`)。 ### 示例 ``` ServerRoot /home/httpd ``` ### 参见 * [`httpd`的 `-d` 选项](#calibre_link-250) * [安全提示](#calibre_link-281)中关于如何正确设置`ServerRoot`权限的部分 ## ServerSignature 指令 | [说明](#calibre_link-18) | 配置服务器生成页面的页脚 | | --- | --- | | [语法](#calibre_link-19) | `ServerSignature On&#124;Off&#124;EMail` | | [默认值](#calibre_link-24) | `ServerSignature Off` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | All | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `ServerSignature`指令允许您配置服务器端生成文档的页脚(错误信息、`mod_proxy`的ftp目录列表、`mod_info`的输出)。您启用这个页脚的原因主要在于处于一个代理服务器链中的时候,用户基本无法辨识出究竟是链中的哪个服务器真正产生了返回的错误信息。 默认的 `Off` 设置没有错误行(这样便与Apache1.2及更旧版本兼容)。采用 `On` 会简单的增加一行关于服务器版本和正在伺服的虚拟主机的`ServerName` ,而 `EMail` 设置会如文档中说明的那样额外创建一个指向`ServerAdmin`的"mailto:"部分。 对于2.0.44以后的版本,显示的详细服务器版本号将由`ServerTokens`指令控制。 ### 参见 * `ServerTokens` ## ServerTokens 指令 | [说明](#calibre_link-18) | 配置"`Server:`"应答头 | | --- | --- | | [语法](#calibre_link-19) | `ServerTokens Major&#124;Minor&#124;Min[imal]&#124;Prod[uctOnly]&#124;OS&#124;Full` | | [默认值](#calibre_link-24) | `ServerTokens Full` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | 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`指令的显示内容。 ### 参见 * `ServerSignature` ## SetHandler 指令 | [说明](#calibre_link-18) | 强制所有匹配的文件被一个指定的处理器处理 | | --- | --- | | [语法](#calibre_link-19) | `SetHandler handler-name&#124;None` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 在Apache2.0中移入核心 | 当这个指令放入`.htaccess`或`<Directory>`或`<Location>`配置段中时,这个指令将强制所有匹配的文件通过handler-name指定的[处理器](#calibre_link-253)处理。比如:如果想不管某个目录中的文件具有什么扩展名,都将它作为图像映射规则文件来解析,您可以将下例放入那个目录的`.htaccess`中: ``` SetHandler imap-file ``` 再来一个例子:如果您想当`http://servername/status`被请求时,服务器显示一个状态报告,您可以将下面的语句放入`httpd.conf`里面: ``` <Location /status> SetHandler server-status </Location> ``` 你可以通过使用 `None` 来改写一个早先定义的`SetHandler`指令。 ### 参见 * `AddHandler` ## SetInputFilter 指令 | [说明](#calibre_link-18) | 设置处理客户端请求和POST输入时使用的过滤器 | | --- | --- | | [语法](#calibre_link-19) | `SetInputFilter filter[;filter...]` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `SetInputFilter`指令为服务器接受并处理客户端请求和POST输入设置了过滤器。这是在其它地方(包括`AddInputFilter`指令)设置的过滤器以外附加的过滤器。 如果设置了多于一个过滤器,它们必须按照处理内容的顺序用分号(;)分隔。 ### 参见 * [过滤器](#calibre_link-15)文档 ## SetOutputFilter 指令 | [说明](#calibre_link-18) | 设置用于处理服务器输出应答的过滤器 | | --- | --- | | [语法](#calibre_link-19) | `SetOutputFilter filter[;filter...]` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `SetOutputFilter`指令设置了用于在服务器应答发送到客户端之前使用的过滤器。这是在其它地方(包括`AddOutputFilter`指令)设置的过滤器以外附加的过滤器。 例如:下述配置将会把`/www/data/`目录下的所有文件作为SSI文件来处理。 ``` <Directory /www/data/> SetOutputFilter INCLUDES </Directory> ``` 如果设置了多于一个过滤器,它们必须按照处理内容的顺序用分号(;)分隔。 ### 参见 * [过滤器](#calibre_link-15)文档 ## TimeOut 指令 | [说明](#calibre_link-18) | 服务器在断定请求失败前等待的秒数 | | --- | --- | | [语法](#calibre_link-19) | `TimeOut seconds` | | [默认值](#calibre_link-24) | `TimeOut 300` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `TimeOut`指令用于设置Apache等待以下三种事件的时间长度: 1. 接受一个GET请求耗费的总时间。 2. POST或PUT请求时,接受两个TCP包之间的时间。 3. 应答时TCP包传输中两个ACK包之间的时间。 我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。 ## TraceEnable 指令 | [说明](#calibre_link-18) | 确定如何处理`TRACE`请求 | | --- | --- | | [语法](#calibre_link-19) | `TraceEnable [on&#124;off&#124;extended]` | | [默认值](#calibre_link-24) | `TraceEnable on` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 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的限制。 ## UseCanonicalName 指令 | [说明](#calibre_link-18) | 配置服务器如何确定它自己的域名和端口 | | --- | --- | | [语法](#calibre_link-19) | `UseCanonicalName On&#124;Off&#124;DNS` | | [默认值](#calibre_link-24) | `UseCanonicalName Off` | | [作用域](#calibre_link-20) | server config, virtual host, directory | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | 在很多情况下,Apache必须构造一个_自引用_URL(即一个指回相同服务器的URL)。使用 `UseCanonicalName On` 会将`ServerName`这个域名用于所有自引用URL、`SERVER_NAME`、CGI中的`SERVER_PORT` 。 设置为 `UseCanonicalName Off` 时,如果客户端提供了主机名和端口(否则将如上所述使用标准域名),Apache将会使用这些信息来构建自引用URL。这些值与用于实现[基于域名的虚拟主机](#calibre_link-75)的值相同,并且对于同样的客户端可用。CGI变量`SERVER_NAME`和`SERVER_PORT`也会由客户端提供的值来构建。 用这样的方式成功解决问题的例子如下:在一个局域网内,您想让连接主机的用户使用诸如`www`这样的短域名进行访问。您会注意到,如果用户键入了类似`http://www/splat`这样的短域名和目录的URL,并且_没有最后的斜线_,Apache会将他们重定向到`http://www.domain.com/splat/`。如果您在这个目录上启用了身份验证,这会导致用户必须进行两次验证:一次针对`www`而另外一次针对`www.domain.com`(参见[关于此主题的FAQ](http://httpd.apache.org/docs/misc/FAQ.html#prompted-twice)获得更多信息)。但如果`UseCanonicalName`设为 `Off` ,Apache就会重定向到`http://www/splat/`。 第三个可选项是 `UseCanonicalName DNS` ,用于为大量基于IP的虚拟主机支持那些古董级的不提供"`Host:`"头的浏览器使用。使用这个选项时,Apache将对客户端连入的服务器的IP地址进行反向DNS查询,以构建自引用URL。 ### 警告 如果CGI对`SERVER_NAME`的值作出了假定,它们会被此选项破坏。客户端对于给出它们想要的主机名这样的行动是完全不受限制的。但如果CGI仅使用`SERVER_NAME`来构建自引用的URL,它们会工作的很好。 ### 参见 * `UseCanonicalPhysicalPort` * `ServerName` * `Listen` ## UseCanonicalPhysicalPort 指令 | [说明](#calibre_link-18) | 配置服务器如何确定自己的名字和端口 | | --- | --- | | [语法](#calibre_link-19) | `UseCanonicalPhysicalPort On&#124;Off` | | [默认值](#calibre_link-24) | `UseCanonicalPhysicalPort Off` | | [作用域](#calibre_link-20) | server config, virtual host, directory | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | | [兼容性](#calibre_link-137) | 仅在 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` 的情况下,物理端口号将会从上述顺序中剔除。 ### 参见 * `UseCanonicalName` * `ServerName` * `Listen` ## &lt;VirtualHost&gt; 指令 | [说明](#calibre_link-18) | 包含仅作用于指定主机名或IP地址的指令 | | --- | --- | | [语法](#calibre_link-19) | `<VirtualHost addr[:port] [addr[:port]] ...&gt; ... &lt;/VirtualHost>` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 核心(C) | | [模块](#calibre_link-22) | core | `<VirtualHost>`和`</VirtualHost>`用于封装一组仅作用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在`<VirtualHost>`配置段中的指令。Addr可以是: * 虚拟主机的IP地址 * 虚拟主机IP地址对应的完整域名 * 字符"`*`",仅与"`NameVirtualHost *`"配合使用以匹配所有的IP地址 * 字符串"`_default_`",与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址 ### 示例 ``` <VirtualHost 10.1.2.3> ServerAdmin webmaster@host.foo.com 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 webmaster@host.example.com 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_`"虚拟主机的配置。参见[基于域名的虚拟主机](#calibre_link-75)文档。 您可以指定一个"`:port`"来改变匹配的端口。如果没有指定,它将沿用主服务器中离它最近的那个`Listen`指定的值。您也可以指定"`:*`"来匹配那个地址上的所有端口(当您使用"`_default_`"时,这是推荐采用的方法)。 ### 安全 参见[安全提示](#calibre_link-263)文档以获得为什么当您存储日志文件的目录对于启动服务器以外的用户来说是可写的会危及服务器安全的详细资料。 ### 参见 * [Apache虚拟主机文档](#calibre_link-36) * [关于DNS和Apache](#calibre_link-55) * [设置Apache使用的地址和端口](#calibre_link-254) * [&lt;Directory&gt;、&lt;Location&gt;、&lt;Files&gt;配置段是如何工作的](#calibre_link-256)中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。