<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 核心功能

可用语言:  de  |  en  |  es  |  fr  |  ja  |  tr 

描述始终可用的 Apache HTTP 服务器核心功能
状态核心
Support Apache!

指令

Bugfix 检查表

另请参阅

top

AcceptFilter 指令

描述为协议侦听套接字配置优化
语法AcceptFilter protocol accept_filter
上下文服务器配置
状态核心
模块核心

此指令通过 Protocol 类型为侦听套接字启用特定于操作系统的优化。基本前提是,在收到数据或缓冲整个 HTTP 请求之前,内核不会向服务器进程发送套接字。目前仅支持 FreeBSD 的 Accept 过滤器、Linux 更原始的 TCP_DEFER_ACCEPT 和 Windows 优化的 AcceptEx()。

对某个参数使用 none 将禁用该协议的所有接受过滤器。这对于需要服务器首先发送数据的协议很有用,例如 ftp:nntp

AcceptFilter nntp none

默认协议名称对于端口 443 是 https,对于所有其他端口是 http。要指定侦听端口使用其他协议,请将 protocol 参数添加到 Listen 指令。

FreeBSD 上的默认值是

AcceptFilter http httpready
AcceptFilter https dataready

httpready 接受过滤器在内核级别缓冲整个 HTTP 请求。收到整个请求后,内核会将其发送到服务器。有关更多详细信息,请参阅 accf_http(9) 手册页。由于 HTTPS 请求已加密,因此仅使用 accf_data(9) 过滤器。

Linux 上的默认值是

AcceptFilter http data
AcceptFilter https data

Linux 的 TCP_DEFER_ACCEPT 不支持缓冲 http 请求。除了 none 之外的任何值都将在该侦听器上启用 TCP_DEFER_ACCEPT。有关更多详细信息,请参阅 Linux tcp(7) 手册页。

Windows 上的默认值是

AcceptFilter http connect
AcceptFilter https connect

Window 的 mpm_winnt 解释 AcceptFilter 以切换 AcceptEx() API,并且不支持 http 协议缓冲。connect 将使用 AcceptEx() API,还会检索网络端点地址,但与 none 一样,connect 选项不会等待初始数据传输。

在 Windows 上,none 使用 accept() 而不是 AcceptEx(),并且不会在连接之间回收套接字。这对于具有损坏驱动程序支持的网络适配器以及某些虚拟网络提供程序(例如 vpn 驱动程序或垃圾邮件、病毒或间谍软件过滤器)很有用。

data AcceptFilter(Windows)

对于 2.4.23 及更早版本,Windows data 接受过滤器会一直等到数据传输完毕,并且从单个 AcceptEx() 调用中检索到初始数据缓冲区和网络端点地址。此实现容易受到拒绝服务攻击,并且已被禁用。

当前版本的 httpd 在 Windows 上默认为 connect 过滤器,如果指定了 data,则会回退到 connect。建议以前版本的使用者为其 AcceptFilter 添加一个明确的 connect 设置,如上所示。

另请参阅

top

AcceptPathInfo 指令

描述资源接受尾随路径名信息
语法AcceptPathInfo On|Off|Default
默认AcceptPathInfo Default
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心

此指令控制是否接受或拒绝包含实际文件名(或现有目录中的不存在文件)后跟尾部路径名信息的请求。尾部路径名信息可以在 PATH_INFO 环境变量中的脚本中使用。

例如,假设位置 /test/ 指向仅包含单个文件 here.html 的目录。然后,对 /test/here.html/more/test/nothere.html/more 的请求都将 /more 收集为 PATH_INFO

AcceptPathInfo 指令的三个可能参数是

Off
仅当请求映射到存在的实际路径时才接受请求。因此,在上述示例中,带有实际文件名后跟尾部路径名信息的请求(例如 /test/here.html/more)将返回 404 NOT FOUND 错误。
On
如果前导路径组件映射到存在的文件,则接受请求。如果 /test/here.html 映射到有效文件,则接受上述示例 /test/here.html/more
默认
带有尾部路径名信息的请求的处理由负责请求的处理程序确定。普通文件的核心处理程序默认为拒绝 PATH_INFO 请求。处理脚本的处理程序(例如 cgi-scriptisapi-handler)通常默认接受 PATH_INFO

AcceptPathInfo 指令的主要目的是允许你覆盖处理程序接受或拒绝 PATH_INFO 的选择。例如,当你使用过滤器(例如 INCLUDES)根据 PATH_INFO 生成内容时,需要此覆盖。核心处理程序通常会拒绝请求,因此你可以使用以下配置来启用此类脚本

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

AccessFileName 指令

描述分布式配置文件的名称
语法AccessFileName filename [filename] ...
默认AccessFileName .htaccess
上下文服务器配置、虚拟主机
状态核心
模块核心

在处理请求时,如果已为该目录启用分布式配置文件,则服务器会在文档路径的每个目录中查找此名称列表中的第一个现有配置文件。例如

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 时要添加的默认字符集参数
语法AddDefaultCharset On|Off|charset
默认AddDefaultCharset Off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心

此指令指定要添加到响应中的媒体类型字符集参数(字符编码的名称)的默认值,当且仅当响应的内容类型为 text/plaintext/html 时。这应该覆盖通过 META 元素在响应正文中指定的任何字符集,尽管确切的行为通常取决于用户的客户端配置。AddDefaultCharset Off 设置禁用此功能。AddDefaultCharset On 启用 iso-8859-1 的默认字符集。任何其他值都假定为要使用的 charset,它应该是IANA 注册的字符集值之一,用于互联网媒体类型(MIME 类型)。例如

AddDefaultCharset utf-8

AddDefaultCharset 仅在所有应用于它的文本资源都已知采用该字符编码并且单独标记其字符集非常不方便时才应使用。一个这样的示例是将字符集参数添加到包含生成内容的资源中,例如可能由于用户提供的数据包含在输出中而容易遭受跨站点脚本攻击的传统 CGI 脚本。但是,请注意,更好的解决方案是只修复(或删除)这些脚本,因为设置默认字符集并不能保护已在其浏览器上启用“自动检测字符编码”功能的用户。

另请参阅

top

AllowEncodedSlashes 指令

描述确定是否允许 URL 中的编码路径分隔符通过
语法AllowEncodedSlashes On|Off|NoDecode
默认AllowEncodedSlashes Off
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性NoDecode 选项在 2.3.12 及更高版本中可用。

AllowEncodedSlashes 指令允许在路径信息中使用包含编码路径分隔符(/%2F,以及在相应系统上 \%5C)的 URL。

使用默认值 Off 时,此类 URL 会被拒绝,并显示 404(未找到)错误。

使用值 On 时,此类 URL 会被接受,并且编码斜杠会像所有其他编码字符一样被解码。

使用值 NoDecode 时,此类 URL 会被接受,但编码斜杠不会被解码,而是保留其编码状态。

AllowEncodedSlashes 设置为 On 主要在与 PATH_INFO 结合使用时很有用。

注意

如果路径信息中需要编码斜杠,强烈建议使用 NoDecode 作为安全措施。允许解码斜杠可能会允许不安全的路径。

另请参阅

top

AllowOverride 指令

描述允许在 .htaccess 文件中使用的指令类型
语法AllowOverride All|None|指令类型 [指令类型] ...
默认AllowOverride None(2.3.9 及更高版本),AllowOverride All(2.3.8 及更低版本)
上下文目录
状态核心
模块核心

当服务器找到一个 .htaccess 文件(如 AccessFileName 指定)时,它需要知道该文件中声明的哪些指令可以覆盖较早的配置指令。

仅在 <Directory> 部分中可用

AllowOverride 仅在未指定正则表达式的 <Directory> 部分中有效,而不是在 <Location><DirectoryMatch><Files> 部分中有效。

当此指令设置为 None,并且 AllowOverrideList 设置为 None 时,.htaccess 文件将被完全忽略。在这种情况下,服务器甚至不会尝试读取文件系统中的 .htaccess 文件。

当此指令设置为 All 时,则任何具有 .htaccess 上下文 的指令都允许在 .htaccess 文件中使用。

指令类型 可以是以下指令分组之一。(有关每个 指令类型 启用了哪些指令的最新列表,请参见 覆盖类索引。)

AuthConfig
允许使用授权指令(AuthDBMGroupFileAuthDBMUserFileAuthGroupFileAuthNameAuthTypeAuthUserFileRequire等等)。
FileInfo
允许使用控制文档类型的指令 (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_alias 指令 (Redirect, RedirectTemp, RedirectPermanent, RedirectMatch) 以及 mod_actions 中的 Action
索引
允许使用控制目录索引的指令 (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName)。
限制
允许使用控制主机访问的指令 (Allow, DenyOrder)。
Nonfatal=[Override|Unknown|All]
允许使用 AllowOverride 选项将 .htaccess 中的语法错误视为非致命错误。禁止或无法识别的指令不会导致内部服务器错误,而是会被忽略并记录警告
  • Nonfatal=Override 将 AllowOverride 禁止的指令视为非致命错误。
  • Nonfatal=Unknown 将未知指令视为非致命错误。这包括拼写错误和未加载模块实现的指令。
  • Nonfatal=All 将以上两者都视为非致命错误。

请注意,有效指令中的语法错误仍会导致内部服务器错误。

安全性

非致命错误可能对 .htaccess 用户造成安全隐患。例如,如果 AllowOverride 不允许 AuthConfig,用户用来限制网站访问的配置将被禁用。
选项[=选项,...]
允许使用控制特定目录功能的指令(OptionsXBitHack)。可以给出一个等号,后面跟一个用逗号分隔的选项列表,不带空格,这些选项可以使用 Options 命令设置。

隐式禁用选项

即使可以使用此指令限制在 .htaccess 文件中使用的选项列表,只要允许任何 Options 指令,就可以使用非相对语法禁用任何其他继承的选项。换句话说,此机制不能强制特定选项保持设置状态,同时允许设置任何其他选项。

AllowOverride Options=Indexes,MultiViews

示例

AllowOverride AuthConfig Indexes

在上面的示例中,所有既不在 AuthConfig 组中也不在 Indexes 组中的指令都会导致内部服务器错误。

出于安全和性能原因,不要在 <Directory "/"> 块中将 AllowOverride 设置为 None 以外的任何值。相反,找到(或创建)引用你实际计划放置 .htaccess 文件的目录的 <Directory> 块。

另请参阅

top

AllowOverrideList 指令

描述.htaccess 文件中允许的各个指令
语法AllowOverrideList None|指令 [指令类型] ...
默认AllowOverrideList None
上下文目录
状态核心
模块核心

当服务器找到一个 .htaccess 文件(如 AccessFileName 指定)时,它需要知道该文件中声明的哪些指令可以覆盖较早的配置指令。

仅在 <Directory> 部分中可用

AllowOverrideList 仅在未指定正则表达式的 <Directory> 部分中有效,在 <Location><DirectoryMatch><Files> 部分中无效。

当此指令设置为 NoneAllowOverride 设置为 None 时,.htaccess 文件将被完全忽略。在这种情况下,服务器甚至不会尝试读取文件系统中的 .htaccess 文件。

示例

AllowOverride None
AllowOverrideList Redirect RedirectMatch

在上面的示例中,只允许 RedirectRedirectMatch 指令。所有其他指令都会导致内部服务器错误。

示例

AllowOverride AuthConfig
AllowOverrideList CookieTracking CookieName

在上面的示例中,AllowOverride 授予 AuthConfig 指令分组的权限,AllowOverrideList 仅授予 FileInfo 指令分组中两个指令的权限。所有其他指令都会导致内部服务器错误。

另请参阅

top

CGIMapExtension 指令

描述用于查找 CGI 脚本解释器的技术
语法CGIMapExtension cgi-path .extension
上下文目录,.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性仅限 NetWare

此指令用于控制 Apache httpd 如何查找用于运行 CGI 脚本的解释器。例如,设置 CGIMapExtension sys:\foo.nlm .foo 将导致所有扩展名为 .foo 的 CGI 脚本文件传递给 FOO 解释器。

top

CGIPassAuth 指令

描述启用将 HTTP 授权头作为 CGI 变量传递给脚本
语法CGIPassAuth On|Off
默认CGIPassAuth Off
上下文目录,.htaccess
覆盖AuthConfig
状态核心
模块核心
兼容性适用于 Apache HTTP Server 2.4.13 及更高版本

CGIPassAuth 允许脚本访问 HTTP 授权头,如 Authorization,这是实现 HTTP 基本身份验证的脚本所必需的。通常,这些 HTTP 头对脚本是隐藏的。这是为了禁止脚本在 Web 服务器中启用 HTTP 基本身份验证时查看用于访问服务器的用户 ID 和密码。当允许脚本实现 HTTP 基本身份验证时,应使用此指令。

此指令可用于替代编译时设置 SECURITY_HOLE_PASS_AUTHORIZATION,该设置在 Apache HTTP Server 的先前版本中可用。

此设置受到使用 ap_add_common_vars() 的任何模块的尊重,例如 mod_cgimod_cgidmod_proxy_fcgimod_proxy_scgi 等。值得注意的是,它会影响那些不以通常意义处理请求但仍然使用此 API 的模块;此类模块的示例包括 mod_includemod_ext_filter。不使用 ap_add_common_vars() 的第三方模块也可以选择尊重此设置。

top

CGIVar 指令

描述控制如何设置某些 CGI 变量
语法CGIVar variable rule
上下文目录,.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性在 Apache HTTP Server 2.4.21 及更高版本中可用

此指令控制如何设置某些 CGI 变量。

REQUEST_URI 规则

original-uri(默认值)
该值取自原始请求行,不会反映更改请求资源的内部重定向或子请求。
current-uri
该值反映当前正在处理的资源,由于内部重定向或子请求,它可能与来自客户端的原始请求不同。
top

ContentDigest 指令

描述启用生成 Content-MD5 HTTP 响应头
语法ContentDigest On|Off
默认ContentDigest Off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖选项
状态核心
模块核心

此指令启用生成 Content-MD5 头,如 RFC1864 和 RFC2616 中所定义。

MD5 是一种用于计算任意长度数据的“消息摘要”(有时称为“指纹”)的算法,它具有高度的置信度,即数据中的任何更改都将反映在消息摘要中的更改中。

Content-MD5 头提供实体正文的端到端消息完整性检查 (MIC)。代理或客户端可以检查此头以检测实体正文在传输过程中的意外修改。示例头

Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==

请注意,这可能会导致服务器出现性能问题,因为消息摘要是在每次请求时计算的(值不会被缓存)。

Content-MD5 仅对 core 提供的文档发送,而不是由任何模块发送。例如,SSI 文档、CGI 脚本的输出和字节范围响应没有此头。

top

DefaultRuntimeDir 指令

描述服务器运行时文件的基目录
语法DefaultRuntimeDir directory-path
默认DefaultRuntimeDir DEFAULT_REL_RUNTIMEDIR (logs/)
上下文服务器配置
状态核心
模块核心
兼容性在 Apache 2.4.2 及更高版本中可用

DefaultRuntimeDir 指令设置服务器将创建各种运行时文件(共享内存、锁等)的目录。如果设置为相对路径,则完整路径将相对于 ServerRoot

示例

DefaultRuntimeDir scratch/

DefaultRuntimeDir 的默认位置可以通过在构建时更改 DEFAULT_REL_RUNTIMEDIR #define 来修改。

注意:ServerRoot 应在此指令使用之前指定。否则,将使用 ServerRoot 的默认值来设置基目录。

另请参阅

top

DefaultType 指令

描述此指令除了在值不是none时发出警告之外,没有其他作用。在之前的版本中,DefaultType 会指定一个默认媒体类型,以分配给找不到其他媒体类型配置的响应内容。
语法DefaultType 媒体类型 | 无
默认DefaultType 无
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性参数none在 Apache httpd 2.2.7 及更高版本中可用。所有其他选项在 2.3.x 及更高版本中已禁用。

此指令已禁用。为了配置文件向后兼容,可以使用值none指定它,表示没有默认媒体类型。例如

DefaultType None

DefaultType None仅在 httpd-2.2.7 及更高版本中可用。

使用 mime.types 配置文件和 AddType 通过文件扩展名配置媒体类型分配,或使用 ForceType 指令为特定资源配置媒体类型。否则,服务器将发送没有 Content-Type 头字段的响应,而接收者可能会尝试猜测媒体类型。

top

Define 指令

描述定义变量
语法Define 参数名称 [参数值]
上下文服务器配置、虚拟主机、目录
状态核心
模块核心

在它的一个参数形式中,Define 等同于向 httpd 传递 -D 参数。它可用于切换 <IfDefine> 部分的使用,而无需更改任何启动脚本中的 -D 参数。

除此之外,如果给出了第二个参数,则将配置变量设置为此值。可以使用 ${VAR} 语法在配置中使用该变量。该变量始终是全局定义的,而不限于周围配置部分的范围。

<IfDefine TEST>
  Define servername test.example.com
</IfDefine>
<IfDefine !TEST>
  Define servername www.example.com
  Define SSL
</IfDefine>

DocumentRoot "/var/www/${servername}/htdocs"

变量名称不能包含冒号 “:” 字符,以避免与 RewriteMap 的语法冲突。

虚拟主机范围和缺陷

虽然此指令在虚拟主机上下文中受支持,但它所做的更改对任何后续配置指令都是可见的,超出了任何封闭的虚拟主机。

另请参阅

top

<Directory> 指令

描述包含一组仅适用于命名的文件系统目录、子目录及其内容的指令。
语法<Directory 目录路径> ... </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 httpd 用于访问文件的文件系统路径完全匹配。应用于特定 <Directory> 的指令不会应用于通过不同路径(例如通过不同的符号链接)从该目录访问的文件。

正则表达式也可以使用,并添加 ~ 字符。例如

<Directory ~ "^/www/[0-9]{3}">

</Directory>

将匹配 /www/ 中由三个数字组成的目录。

如果多个(非正则表达式)<Directory> 部分与包含文档的目录(或其父级目录之一)匹配,则按最短匹配优先的顺序应用指令,并穿插 .htaccess 文件中的指令。例如,使用

<Directory "/">
  AllowOverride None
</Directory>

<Directory "/home">
  AllowOverride FileInfo
</Directory>

访问文档 /home/web/dir/doc.html 的步骤如下

在应用所有常规部分后才会考虑正则表达式。然后按其在配置文件中出现的顺序测试所有正则表达式。例如,使用

<Directory ~ "abc$">
  # ... directives here ...
</Directory>

在应用所有常规 <Directory>.htaccess 文件后,才会考虑正则表达式部分。然后,正则表达式将匹配 /home/abc/public_html/abc,并应用相应的 <Directory>

请注意,<Directory "/"> 的默认访问权限是允许所有访问。这意味着 Apache httpd 将提供从 URL 映射的任何文件。建议使用如下块更改此设置

<Directory "/">
  Require all denied
</Directory>

然后针对您希望可访问的目录覆盖此设置。有关更多详细信息,请参阅 安全提示 页面。

目录部分出现在 httpd.conf 文件中。<Directory> 指令不能嵌套,并且不能出现在 <Limit><LimitExcept> 部分中。

另请参阅

top

<DirectoryMatch> 指令

描述将适用于与正则表达式匹配的文件系统目录内容的指令括起来。
语法<DirectoryMatch regex> ... </DirectoryMatch>
上下文服务器配置、虚拟主机
状态核心
模块核心

<DirectoryMatch></DirectoryMatch> 用于括起一组指令,这些指令仅适用于命名的目录(和其中的文件),与 <Directory> 相同。但是,它以 正则表达式 作为参数。例如

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

匹配 /www/(或其任何子目录)中由三个数字组成的目录。

兼容性

在 2.3.9 之前,此指令隐式应用于子目录(如 <Directory>),并且无法匹配行尾符号 ($)。在 2.3.9 及更高版本中,只有与表达式匹配的目录才会受到括起指令的影响。

尾部斜杠

此指令适用于可能以尾部斜杠结尾或不结尾的目录请求,因此必须谨慎编写锚定到行尾 ($) 的表达式。

从 2.4.8 开始,将捕获命名组和反向引用,并将其写入环境,其中相应名称前缀为“MATCH_”并大写。这允许从 表达式mod_rewrite 等模块中引用路径元素。为了避免混淆,将忽略编号(未命名)反向引用。请改用命名组。

<DirectoryMatch "^/var/www/combined/(?<sitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</DirectoryMatch>

另请参阅

top

DocumentRoot 指令

描述从 Web 可见的形成主文档树的目录
语法DocumentRoot directory-path
默认DocumentRoot "/usr/local/apache/htdocs"
上下文服务器配置、虚拟主机
状态核心
模块核心

此指令设置 httpd 将提供文件的目录。除非与 Alias 等指令匹配,否则服务器会将请求的 URL 中的路径附加到文档根目录中,以形成文档的路径。示例

DocumentRoot "/usr/web"

那么对 http://my.example.com/index.html 的访问是指 /usr/web/index.html。如果 directory-path 不是绝对路径,则假定它相对于 ServerRoot

指定 DocumentRoot 时,不要使用尾部斜杠。

另请参阅

top

<Else> 指令

描述包含仅当请求在运行时不满足先前 <If><ElseIf> 部分的条件时才应用的指令
语法<Else> ... </Else>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 2.4.26 及更高版本中评估嵌套条件

仅当同一作用域中最近的 <If><ElseIf> 部分尚未应用时,<Else> 才会应用所包含的指令。例如:在

<If "-z req('Host')">
  # ...
</If>
<Else>
  # ...
</Else>

<If> 将匹配没有 Host: 标头的 HTTP/1.0 请求,而 <Else> 将匹配带有 Host: 标头的请求。

另请参阅

top

<ElseIf> 指令

描述包含仅当请求在运行时满足条件,而先前 <If><ElseIf> 部分的条件不满足时才应用的指令
语法<ElseIf expression> ... </ElseIf>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 2.4.26 及更高版本中评估嵌套条件

仅当给定条件求值为 true 且同一作用域中最近的 <If><ElseIf> 部分尚未应用时,<ElseIf> 才会应用所包含的指令。例如:在

<If "-R '10.1.0.0/16'">
  #...
</If>
<ElseIf "-R '10.0.0.0/8'">
  #...
</ElseIf>
<Else>
  #...
</Else>

如果请求的远程地址属于子网 10.0.0.0/8 但不属于子网 10.1.0.0/16,则 <ElseIf> 将匹配。

另请参阅

top

EnableMMAP 指令

描述在传输过程中使用内存映射来读取文件
语法EnableMMAP On|Off
默认EnableMMAP On
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心

此指令控制 httpd 在传输过程中需要读取文件内容时是否可以使用内存映射。默认情况下,当处理请求需要访问文件中的数据时(例如,使用 mod_include 传输服务器解析的文件时),如果操作系统支持,Apache httpd 会对文件进行内存映射。

此内存映射有时会提高性能。但在某些环境中,最好禁用内存映射以防止出现操作问题

对于容易出现这些问题的服务器配置,应通过指定以下内容来禁用已传递文件的内存映射

EnableMMAP Off

对于 NFS 挂载的文件,可以通过指定以下内容明确禁用该功能

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

EnableSendfile 指令

描述使用内核 sendfile 支持向客户端传递文件
语法EnableSendfile On|Off
默认EnableSendfile Off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性在 2.3.9 版本中,默认值已更改为 Off。

此指令控制 httpd 是否可以使用内核的 sendfile 支持将文件内容传输到客户端。默认情况下,当处理请求不需要访问文件中的数据(例如,在传递静态文件时),Apache httpd 会使用 sendfile 传递文件内容,而无需读取文件(如果操作系统支持)。

此 sendfile 机制避免了单独的读取和发送操作以及缓冲区分配。但在某些平台或某些文件系统中,最好禁用此功能以避免操作问题

对于不容易出现这些问题的服务器配置,可以通过指定以下内容来启用此功能

EnableSendfile On

对于网络挂载的文件,可以通过指定以下内容明确禁用该功能

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

请注意,EnableSendfile 的每个目录和 .htaccess 配置不受 mod_cache_disk 支持。该模块仅考虑 EnableSendfile 的全局定义。

top

Error 指令

描述使用自定义错误消息中止配置解析
语法Error message
上下文服务器配置、虚拟主机、目录、.htaccess
状态核心
模块核心
兼容性2.3.9 及更高版本

如果在配置中检测到错误,可以使用此指令生成自定义错误消息并停止配置解析。典型用法是报告配置中缺少的必需模块。

# Example
# ensure that mod_include is loaded
<IfModule !include_module>
  Error "mod_include is required by mod_foo.  Load it with LoadModule."
</IfModule>

# ensure that exactly one of SSL,NOSSL is defined
<IfDefine SSL>
<IfDefine NOSSL>
  Error "Both SSL and NOSSL are defined.  Define only one of them."
</IfDefine>
</IfDefine>
<IfDefine !SSL>
<IfDefine !NOSSL>
  Error "Either SSL or NOSSL must be defined."
</IfDefine>
</IfDefine>

注意

此指令在配置处理时间而不是在运行时进行评估。因此,此指令不能通过将其包含在 <If> 部分中来进行条件评估。

top

ErrorDocument 指令

描述服务器在发生错误时将返回给客户端的内容
语法ErrorDocument error-code document
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心

在出现问题或错误时,可以将 Apache httpd 配置为执行以下四项操作之一,

  1. 输出一个简单的硬编码错误消息
  2. 输出一个自定义消息
  3. 在内部重定向到本地 URL-path 来处理问题/错误
  4. 重定向到外部 URL 来处理问题/错误

第一个选项是默认选项,而选项 2-4 使用 ErrorDocument 指令进行配置,后跟 HTTP 响应代码和 URL 或消息。Apache httpd 有时会提供有关问题/错误的其他信息。

从 2.4.13 开始,表达式语法可用于指令内部以生成动态字符串和 URL。

URL 可以以斜杠 (/) 开头,表示本地 Web 路径(相对于 DocumentRoot),或是一个客户端可以解析的完整 URL。或者,可以提供一条消息供浏览器显示。请注意,在解析任何表达式之前,会先确定参数是 URL、路径还是消息。示例

ErrorDocument 500 http://example.com/cgi-bin/server-error.cgi
ErrorDocument 404 /errors/bad_urls.php
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Sorry, can't allow you access today"
ErrorDocument 403 Forbidden!
ErrorDocument 403 /errors/forbidden.py?referrer=%{escape:%{HTTP_REFERER}}

此外,可以使用特殊值 default 来指定 Apache httpd 的简单硬编码消息。虽然在正常情况下不需要,但 default 会为本来会继承现有 ErrorDocument 的配置恢复 Apache httpd 的简单硬编码消息。

ErrorDocument 404 /cgi-bin/bad_urls.pl

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

请注意,当您指定指向远程 URL(即其前面带有 http 等方法的任何内容)的 ErrorDocument 时,Apache HTTP Server 会向客户端发送重定向,以告知其在何处可以找到该文档,即使该文档最终位于同一服务器上。这有几个含义,最重要的是客户端不会收到原始错误状态代码,而会收到重定向状态代码。这反过来会混淆 Web 机器人和尝试使用状态代码来确定 URL 是否有效的其他客户端。此外,如果您在 ErrorDocument 401 中使用远程 URL,客户端将不知道提示用户输入密码,因为它不会收到 401 状态代码。因此,如果您使用 ErrorDocument 401 指令,那么它必须引用本地文档。

默认情况下,Microsoft Internet Explorer (MSIE) 会在服务器生成的错误消息“太小”时忽略这些消息,并代之以其自己的“友好”错误消息。大小阈值因错误类型而异,但一般来说,如果您使错误文档大于 512 字节,则 MSIE 会显示服务器生成的错误,而不是对其进行屏蔽。有关更多信息,请参阅 Microsoft 知识库文章 Q294807

虽然大多数错误消息都可以被覆盖,但在某些情况下,无论 ErrorDocument 的设置如何,都会使用内部消息。特别是,如果检测到格式错误的请求,正常的请求处理将立即停止,并返回内部错误消息。这是为了防止因错误请求而导致的安全问题。

如果您正在使用 mod_proxy,您可能希望启用 ProxyErrorOverride,以便您可以代表您的源服务器提供自定义错误消息。如果您不启用 ProxyErrorOverride,Apache httpd 将不会为代理内容生成自定义错误文档。

另请参阅

top

ErrorLog 指令

描述服务器记录错误的位置
语法ErrorLog file-path|syslog[:[facility][:tag]]
默认ErrorLog logs/error_log(Unix)ErrorLog logs/error.log(Windows 和 OS/2)
上下文服务器配置、虚拟主机
状态核心
模块核心

ErrorLog 指令设置服务器将记录其遇到的任何错误的文件的名称。如果 file-path 不是绝对路径,则假定它相对于 ServerRoot

ErrorLog "/var/log/httpd/error_log"

如果 file-path 以管道字符“|”开头,则假定它是一个用于处理错误日志的派生命令。

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

有关更多信息,请参阅 管道日志 的注释。

使用 syslog 而不是文件名,如果系统支持,可以通过 syslogd(8) 进行日志记录。默认情况下使用 syslog 设施 local7,但你可以使用 syslog:facility 语法覆盖它,其中 facility 可以是 syslog(1) 中通常记录的名称之一。该设施实际上是全局的,如果在各个虚拟主机中更改了它,则指定的最终设施将影响整个服务器。syslog 标记也适用相同的规则,它在大多数情况下默认使用 Apache 二进制名称 httpd。你也可以使用 syslog::tag 语法覆盖它。

ErrorLog syslog:user
ErrorLog syslog:user:httpd.srv1
ErrorLog syslog::httpd.srv2

安全性:有关如果存储日志文件的目录可被启动服务器的用户以外的任何人写入,为什么你的安全性可能会受到损害的详细信息,请参阅 安全提示 文档。

注意

在非 Unix 平台上输入文件路径时,即使该平台允许使用反斜杠,也应注意仅使用正斜杠。总的来说,最好始终在配置文件中使用正斜杠。

另请参阅

top

ErrorLogFormat 指令

描述错误日志条目的格式规范
语法ErrorLogFormat [connection|request] format
上下文服务器配置、虚拟主机
状态核心
模块核心

ErrorLogFormat 允许指定除了实际日志消息之外在错误日志中记录的补充信息。

#Simple example
ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client %a] %M"

connectionrequest 指定为第一个参数允许指定其他格式,导致在为特定连接或请求记录第一条消息时记录其他信息。此附加信息仅在每个连接/请求中记录一次。如果处理连接或请求时未导致任何日志消息,则也不会记录附加信息。

某些格式字符串项可能不会产生输出。例如,只有当日志消息与请求关联并且日志消息发生在已从客户端读取 Referer 头的时间时,才会存在 Referer 头。如果没有产生输出,则默认行为是从前一个空格字符删除到下一个空格字符的所有内容。这意味着日志行隐式地划分为非空格到空格转换的字段。如果格式字符串项未产生输出,则会省略整个字段。例如,如果日志格式 [%t] [%l] [%a] %M  中的远程地址 %a 不可获取,则也不会记录周围的括号。可以使用反斜杠转义空格字符,以防止它们分隔字段。组合 '% '(百分号空格)是一个零宽字段分隔符,不会产生任何输出。

可以通过向格式字符串项添加修饰符来更改上述行为。-(减号)修饰符会导致在相应项不产生任何输出时记录减号。在每个连接/请求格式中,还可以使用 +(加号)修饰符。如果带有加号修饰符的项不产生任何输出,则会省略整行。

可以使用一个数字作为修饰符,将日志严重性级别分配给格式项。仅当日志消息的严重性不高于指定的日志严重性级别时,才会记录该项。该数字范围从 1(警报)到 4(警告)和 7(调试)到 15(跟踪 8)。

例如,如果你向记录 Referer 请求头的 %{Referer}i 令牌添加修饰符,将会发生以下情况。

修改后的令牌含义
%-{Referer}i 如果未设置 Referer,则记录 -
%+{Referer}i 如果未设置 Referer,则省略整行。
%4{Referer}i 仅当日志消息严重性高于 4 时才记录 Referer

某些格式字符串项接受大括号中的其他参数。

格式字符串 描述
%% 百分号
%a 客户端 IP 地址和请求的端口
%{c}a 连接的基础对等 IP 地址和端口(请参阅 mod_remoteip 模块)
%A 本地 IP 地址和端口
%{name}e 请求环境变量 name
%E APR/OS 错误状态代码和字符串
%F 日志调用的源文件名和行号
%{name}i 请求标头 name
%k 此连接上的保持活动请求数
%l 消息的日志级别
%L 请求的日志 ID
%{c}L 连接的日志 ID
%{C}L 如果在连接范围内使用,则为连接的日志 ID,否则为空
%m 记录消息的模块的名称
%M 实际的日志消息
%{name}n 请求注释 name
%P 当前进程的进程 ID
%T 当前线程的线程 ID
%{g}T 当前线程的系统唯一线程 ID(与例如 top 显示的 ID 相同;目前仅限 Linux)
%t 当前时间
%{u}t 包括微秒的当前时间
%{cu}t 包括微秒的紧凑 ISO 8601 格式的当前时间
%v 当前服务器的规范 ServerName
%V 根据 UseCanonicalName 设置为请求提供服务的服务器的服务器名称。
(反斜杠空格) 非字段分隔空格
(百分号空格) 字段分隔符(无输出)

日志 ID 格式 %L 为连接或请求生成一个唯一 ID。这可用于关联哪些日志行属于同一连接或请求,哪个请求发生在哪个连接上。%L 格式字符串在 mod_log_config 中也可用,以便将访问日志条目与错误日志行关联起来。如果加载了 mod_unique_id,则其唯一 ID 将用作请求的日志 ID。

#Example (default format for threaded MPMs)
ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"

这将导致以下错误消息

[Thu May 12 08:28:57.652118 2011] [core:error] [pid 8777:tid 4326490112] [client ::1:58619] 文件不存在:/usr/local/apache2/htdocs/favicon.ico

请注意,如上所述,某些字段被完全省略,因为它们未定义。

#Example (similar to the 2.2.x format)
ErrorLogFormat "[%t] [%l] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"
#Advanced example with request/connection log IDs
ErrorLogFormat "[%{uc}t] [%-m:%-l] [R:%L] [C:%{C}L] %7F: %E: %M"
ErrorLogFormat request "[%{uc}t] [R:%L] Request %k on C:%{c}L pid:%P tid:%T"
ErrorLogFormat request "[%{uc}t] [R:%L] UA:'%+{User-Agent}i'"
ErrorLogFormat request "[%{uc}t] [R:%L] Referer:'%+{Referer}i'"
ErrorLogFormat connection "[%{uc}t] [C:%{c}L] remote\ %a local\ %A"

另请参阅

top

ExtendedStatus 指令

描述跟踪每个请求的扩展状态信息
语法ExtendedStatus On|Off
默认ExtendedStatus Off[*]
上下文服务器配置
状态核心
模块核心

此选项跟踪每个工作进程的附加数据,有关当前执行的请求,并创建一个利用率摘要。您可以通过配置 mod_status 在运行时查看这些变量。请注意,其他模块可能依赖于此记分板。

此设置适用于整个服务器,不能逐个虚拟主机启用或禁用。收集扩展状态信息可能会使服务器变慢。另外请注意,此设置不能在平滑重启期间更改。

请注意,加载 mod_status 会将默认行为更改为 ExtendedStatus On,而其他第三方模块也可能这样做。此类模块依赖于收集有关所有工作进程状态的详细信息。默认值由 mod_status 从 2.3.6 版开始更改。之前的默认值始终为 Off。

top

FileETag 指令

描述用于为静态文件创建 ETag HTTP 响应标头的文件属性
语法FileETag component ...
默认FileETag MTime Size
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性在 2.3.14 及更早版本中,默认值曾为“INode MTime Size”。

FileETag 指令配置用于在文档基于静态文件时创建 ETag(实体标记)响应标头字段的文件属性。(ETag 值用于缓存管理,以节省网络带宽。)FileETag 指令允许您选择是否使用这些属性(如果有)。识别的关键字为

INode
文件的 i 节点号将包含在计算中
MTime
文件上次修改的日期和时间将包含在计算中
Size
文件中的字节数将包含在计算中
全部
将使用所有可用字段。这等效于
FileETag INode MTime Size
Digest
如果文档基于文件,则通过对文件进行摘要来计算 ETag 字段。
None
如果文档基于文件,则响应中不会包含 ETag 字段

INodeMTimeSizeDigest 关键字可以分别加上前缀 +-,这允许对从更广泛范围继承的默认设置进行更改。任何不带此类前缀出现的关键字都会立即且完全取消继承的设置。

如果目录的配置包括 FileETag INode MTime Size,而子目录的配置包括 FileETag -INode,则该子目录的设置(将由未覆盖它的任何子子目录继承)将等效于 FileETag MTime Size

服务器端包含

对于由 mod_include 解析的响应不会生成 ETag,因为响应实体可以在不更改嵌入 SSI 指令的静态文件的 INode、MTime、Size 或 Digest 的情况下发生更改。
top

<Files> 指令

描述包含适用于匹配的文件名的指令
语法<Files filename> ... </Files>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

指令 <Files> 通过文件名限制所包含指令的范围。它与 <Directory><Location> 指令类似。它应该与 </Files> 指令匹配。在此部分中给出的指令将应用于基本名称(文件名的最后一个组成部分)与指定文件名匹配的任何对象。在读取 <Directory> 部分和 .htaccess 文件之后,但 <Location> 部分之前,将按它们在配置文件中出现的顺序处理 <Files> 部分。请注意,可以在 <Directory> 部分中嵌套 <Files> 以限制它们应用到的文件系统部分。

filename 参数应包含文件名或通配符字符串,其中 ? 匹配任何单个字符,而 * 匹配任何字符序列。

<Files "cat.html">
    # Insert stuff that applies to cat.html here
</Files>

<Files "?at.*">
    # This would apply to cat.html, bat.html, hat.php and so on.
</Files>

正则表达式也可以使用,并添加 ~ 字符。例如

<Files ~ "\.(gif|jpe?g|png)$">
    #...
</Files>

将匹配大多数常见的 Internet 图形格式。但是,更推荐使用 <FilesMatch>

请注意,与 <Directory><Location> 部分不同,可以在 .htaccess 文件中使用 <Files> 部分。这允许用户逐个文件地控制对他们自己文件的访问。

另请参阅

top

<FilesMatch> 指令

描述包含应用于正则表达式匹配文件名的指令
语法<FilesMatch regex> ... </FilesMatch>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

指令 <FilesMatch> 通过文件名限制所包含指令的范围,就像 <Files> 指令所做的那样。但是,它接受 正则表达式。例如

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

将匹配大多数常见的 Internet 图形格式。

正则表达式开始处的 .+ 确保不会匹配名为 .png.gif 等的文件。

从 2.4.8 开始,将捕获命名组和反向引用并将其写入环境,其中相应名称以“MATCH_”为前缀并大写。这允许从 表达式mod_rewrite 等模块中引用文件元素。为了防止混淆,将忽略编号(未命名)反向引用。请改用命名组。

<FilesMatch "^(?<sitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</FilesMatch>

另请参阅

top

FlushMaxPipelined 指令

描述超过此数量的管道响应将被刷新到网络
语法FlushMaxPipelined number
默认FlushMaxPipelined 5
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性2.4.47 及更高版本

此指令允许配置管道响应的最大数量,只要收到管道请求,这些响应就会一直处于挂起状态。达到限制时,响应将以阻塞模式强制刷新到网络,直到再次低于限制。

FlushMaxPipelined 有助于限制内存使用。当设置为 0 时,管道将被禁用,当设置为 -1 时,没有限制(FlushMaxThreshold 仍然适用)。

top

FlushMaxThreshold 指令

描述超过此阈值,挂起数据将被刷新到网络
语法FlushMaxThreshold number-of-bytes
默认FlushMaxThreshold 65535
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性2.4.47 及更高版本

此指令允许配置挂起输出数据(以字节为单位)的阈值。达到限制时,数据将以阻塞模式强制刷新到网络,直到再次低于限制。

FlushMaxThreshold 有助于限制内存使用。当设置为 0 或过小值时,实际上没有待处理数据,但对于线程化 MPM,可能会有更多线程繁忙地等待网络,因此可用于处理其他同时连接的线程更少。

top

ForceType 指令

描述强制所有匹配文件在 HTTP Content-Type 头字段中使用指定媒体类型提供服务
语法ForceType 媒体类型|无
上下文目录,.htaccess
覆盖FileInfo
状态核心
模块核心

当放置在 .htaccess 文件或 <Directory><Location><Files> 部分中时,此指令强制所有匹配文件使用 媒体类型 给出的内容类型标识提供服务。例如,如果您有一个目录中装满了 GIF 文件,但不想全部用 .gif 标记,您可能希望使用

ForceType image/gif

请注意,此指令会覆盖 mime.types 中定义的其他间接媒体类型关联或通过 AddType 覆盖。

您还可以使用 值覆盖更通用的 ForceType 设置

# force all files to be image/gif:
<Location "/images">
  ForceType image/gif
</Location>

# but normal mime-type associations here:
<Location "/images/mixed">
  ForceType None
</Location>

此指令主要覆盖从文件系统提供的静态文件生成的媒体类型。对于静态文件以外的资源,其中响应的生成器通常会指定 Content-Type,此指令不起作用。

注意

SetHandlerAddHandler 等明确指令不适用于当前请求时,通常由这些指令设置的内部处理程序名称将设置为与该指令指定的内容类型匹配。这是一些第三方模块(如 mod_php)可能使用“魔术”内容类型(仅用于向模块发出处理匹配请求的责任的信号)的历史行为。应通过使用 SetHandlerAddHandler 避免依赖于此类“魔术”类型的配置。

top

GprofDir 指令

描述将 gmon.out 分析数据写入的目录。
语法GprofDir /tmp/gprof/|/tmp/gprof/%
上下文服务器配置、虚拟主机
状态核心
模块核心

当服务器已使用 gprof 分析支持进行编译时,GprofDir 会导致在进程退出时将 gmon.out 文件写入指定目录。如果参数以百分号('%')结尾,则会为每个进程 ID 创建子目录。

此指令目前仅适用于 prefork MPM。

top

HostnameLookups 指令

描述对客户端 IP 地址启用 DNS 查找
语法HostnameLookups 开|关|双
默认HostnameLookups 关
上下文服务器配置、虚拟主机、目录
状态核心
模块核心

此指令启用 DNS 查找,以便可以记录主机名(并在 REMOTE_HOST 中传递给 CGI/SSI)。值 指执行双重反向 DNS 查找。也就是说,在执行反向查找后,然后对该结果执行正向查找。正向查找中至少一个 IP 地址必须与原始地址匹配。(在“tcpwrappers”术语中,这称为 PARANOID。)

无论设置如何,当 mod_authz_host 用于通过主机名控制访问时,将执行双重反向查找。这是出于安全考虑。请注意,除非您设置 HostnameLookups Double,否则通常无法获得此双重反向查找的结果。例如,如果仅 HostnameLookups On 并且对受主机名限制保护的对象发出请求,无论双重反向查找是否失败,CGI 仍将在 REMOTE_HOST 中传递单重反向查找结果。

默认值为 Off,以节省那些实际上不需要执行反向查找的网站的网络流量。对于最终用户来说,这更好,因为他们不必承受查找带来的额外延迟。负载较重的网站应将此指令保留为 Off,因为 DNS 查找可能需要大量时间。默认情况下编译到安装目录的 bin 子目录的实用程序 logresolve 可用于离线从已记录的 IP 地址查找主机名。

最后,如果您有 基于主机名的 Require 指令,无论 HostnameLookups 的设置如何,都将执行主机名查找。

top

HttpProtocolOptions 指令

描述修改对 HTTP 请求消息的限制
语法HttpProtocolOptions [Strict|Unsafe] [RegisteredMethods|LenientMethods] [Allow0.9|Require1.0]
默认HttpProtocolOptions Strict LenientMethods Allow0.9
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性2.2.32 或 2.4.24 及更高版本

此指令更改了应用于 HTTP 请求行 (RFC 7230 §3.1.1) 和 HTTP 请求头字段 (RFC 7230 §3.2) 的规则,这些规则现在默认应用或使用 Strict 选项。由于遗留模块、应用程序或必须弃用的自定义用户代理,已添加 Unsafe 选项以恢复到遗留行为。

这些规则在请求处理之前应用,因此必须在全局或默认(第一个)匹配虚拟主机部分通过 IP/端口接口(而不是通过名称)进行配置才能得到遵守。

该指令接受以下选项列表中的三个参数,将默认值应用于未指定的参数

Strict|Unsafe

在此指令引入之前,Apache HTTP Server 请求消息解析器可以容忍许多不符合协议的输入形式。 RFC 7230 §9.4 请求拆分§9.5 响应走私 仅指出了接受不符合要求的请求消息的两个潜在风险,而 RFC 7230 §3.5 “消息解析健壮性”指出了接受模糊空白和请求消息格式的风险。自引入此指令以来,所有语法规则都在默认 Strict 操作模式下强制执行,并且第 3.5 节建议的严格空白得到强制执行且无法放松。

Unsafe 的安全风险

强烈建议用户不要切换 Unsafe 操作模式,尤其是在面向外部的、可公开访问的服务器部署上。如果内联网上运行的故障监控或其他自定义服务使用者需要接口,用户应仅在配置为服务其内部专用网络的特定虚拟主机上切换 Unsafe 选项。

导致 HTTP 400 的请求示例(使用 Strict 模式)

# 缺少 CRLF
GET / HTTP/1.0\n\n

命令行工具和 CRLF

某些工具需要强制使用 CRLF,否则 httpd 将返回 HTTP 400 响应,如上文用例中所述。例如,OpenSSL s_client 需要 -crlf 参数才能正常工作

在检查 HTTP 请求以识别 CRLF 缺失等问题时,DumpIOInput 指令可以提供帮助。

RegisteredMethods|LenientMethods

RFC 7231 §4.1“请求方法” “概述”要求源服务器在请求行中遇到不受支持的方法时,应响应 HTTP 501 状态代码。当使用 LenientMethods 选项时,这种情况已经发生,但管理员可能希望切换 RegisteredMethods 选项,并使用 RegisterHttpMethod 指令注册任何非标准方法,特别是如果 Unsafe 选项已被切换。

正向代理兼容性

对于正向代理主机,不应切换 RegisteredMethods 选项,因为源服务器支持的方法对代理服务器未知。

在 LenientMethods 模式下导致 HTTP 501 的请求示例

# 未知 HTTP 方法
WOW / HTTP/1.0\r\n\r\n

# 小写 HTTP 方法
get / HTTP/1.0\r\n\r\n

Allow0.9|Require1.0

RFC 2616 §19.6“与以前版本的兼容性”鼓励 HTTP 服务器支持旧版 HTTP/0.9 请求。RFC 7230 用“已删除支持 HTTP/0.9 请求的期望”取代了这一点,并在 RFC 7230 附录 A 中提供了其他评论。Require1.0 选项允许用户删除对默认 Allow0.9 选项行为的支持。

在 Require1.0 模式下导致 HTTP 400 的请求示例

# 不支持的 HTTP 版本
GET /\r\n\r\n

查看记录到 ErrorLog 的消息,该消息已使用 LogLevel debug 级别进行配置,可以帮助识别此类错误请求及其来源。用户应特别注意访问日志中对意外拒绝的无效请求的 400 响应。

top

<If> 指令

描述包含仅在运行时请求满足条件时才应用的指令
语法<If expression> ... </If>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 2.4.26 及更高版本中评估嵌套条件

<If> 指令在运行时评估表达式,并且仅当表达式求值为 true 时才应用封闭的指令。例如

<If "-z req('Host')">

将匹配没有 Host: 标头的 HTTP/1.0 请求。表达式可能包含用于字符串比较(==!=<、...)、整数比较(-eq-ne、...)和其他操作(-n-z-f、...)的各种类 shell 运算符。还可以使用正则表达式、

<If "%{QUERY_STRING} =~ /(delete|commit)=.*?elem/">

类 shell 模式匹配和许多其他操作。这些操作可以在请求标头(req)、环境变量(env)和许多其他属性上执行。完整文档可在 Apache HTTP 服务器中的表达式 中找到。

在此配置部分中,只能使用支持 目录上下文 的指令。

某些变量,例如 CONTENT_TYPE 和其他响应标头,在 <If> 条件已经评估后设置,因此无法在此指令中使用。
在配置解析期间生效的指令,例如 DefineIncludeError,不能通过将它们包含在 if <If> 配置部分中来使其有条件。这些部分始终是配置的一部分,无论它们在运行时如何评估。

另请参阅

top

<IfDefine> 指令

描述如果在启动时测试为真,则包含将被处理的指令
语法<IfDefine [!]parameter-name> ... </IfDefine>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

<IfDefine test>...</IfDefine> 部分用于标记条件指令。<IfDefine> 部分内的指令仅在 test 为真时才会被处理。如果 test 为假,则开始和结束标记之间的所有内容都将被忽略。

<IfDefine> 部分指令中的 test 可以采用两种形式之一

在前一种情况下,仅当名为 parameter-name 的参数被定义时,开始和结束标记之间的指令才会被处理。第二种格式会反转测试,并且仅当 parameter-name 被定义时才会处理指令。

<IfDefine> 部分的 parameter-name 参数是通过在服务器启动时通过 -Dparameter httpd 命令行上给出的定义,或通过 Define 指令给出的定义。

<IfDefine> 部分是可嵌套的,可用于实现简单的多参数测试。示例

httpd -DReverseProxy -DUseCache -DMemCache ...

<IfDefine ReverseProxy>
  LoadModule proxy_module   modules/mod_proxy.so
  LoadModule proxy_http_module   modules/mod_proxy_http.so
  <IfDefine UseCache>
    LoadModule cache_module   modules/mod_cache.so
    <IfDefine MemCache>
      LoadModule mem_cache_module   modules/mod_mem_cache.so
    </IfDefine>
    <IfDefine !MemCache>
      LoadModule cache_disk_module   modules/mod_cache_disk.so
    </IfDefine>
  </IfDefine>
</IfDefine>
top

<IfDirective> 指令

描述包含在特定指令存在或不存在时处理的指令
语法<IfDirective [!]directive-name> ... </IfDirective>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 2.4.34 及更高版本中可用。

<IfDirective test>...</IfDirective> 部分用于标记在特定指令存在时有条件的指令。<IfDirective> 部分内的指令仅在 test 为真时才会被处理。如果 test 为假,则开始和结束标记之间的所有内容都将被忽略。

<IfDirective> 部分中的 test 可以采用两种形式之一

在前一种情况下,仅当在处理时存在给定名称的指令时,开始和结束标记之间的指令才会被处理。第二种格式会反转测试,并且仅当 directive-name 不存在时才会处理指令。

仅当您需要一个适用于多个版本的 httpd 的配置文件时,无论特定指令是否可用,才应使用此部分。在正常操作中,指令不需要放在 <IfDirective> 部分中。

另请参阅

top

<IfFile> 指令

描述仅当文件在启动时存在时才会包含将被处理的指令
语法<IfFile [!]filename> ... </IfFile>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 2.4.34 及更高版本中可用。

<IfFile filename>...</IfFile> 部分用于标记有条件存在于磁盘上的文件的指令。<IfFile> 部分中的指令仅在 filename 存在时才会处理。如果 filename 不存在,则起始标记和结束标记之间的所有内容都会被忽略。filename 可以是绝对路径或相对于服务器根目录的路径。

<IfFile> 部分指令中的 filename 可以采用与 <IfDefine> 部分中的 test 变量相同形式,即如果 ! 字符直接位于 filename 之前,则可以否定测试。

如果提供了相对 filename,则检查是 <a href="#serverroot">ServerRoot> 相对的。如果此指令出现在 <a href="#serverroot">ServerRoot> 之前,则路径将相对于编译的服务器根目录或通过 -d 参数在命令行中传入的服务器根目录进行检查。

警告

在 2.4.34 中,无法使用周围引号指定 filename。这会在启动时生成解析错误。主要影响是无法使用带有空格的文件名。此行为已在 2.4.35 中修复。
top

<IfModule> 指令

描述包含有条件处理特定模块存在或不存在的指令
语法<IfModule [!]module-file|module-identifier> ... </IfModule>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性模块标识符在 2.1 及更高版本中可用。

<IfModule test>...</IfModule> 部分用于标记有条件存在特定模块的指令。<IfModule> 部分中的指令仅在 test 为 true 时才会处理。如果 test 为 false,则起始标记和结束标记之间的所有内容都会被忽略。

<IfModule> 部分指令中的 test 可以采用以下两种形式之一

在前一种情况下,仅当名为 module 的模块包含在 Apache httpd 中(通过 <a href="../mod/mod_so.html#loadmodule">LoadModule> 编译或动态加载)时,才会处理起始标记和结束标记之间的指令。第二种格式会反转测试,并且仅在 包含 module 时才会处理指令。

在编译时,module 参数可以是模块标识符或模块的文件名。例如,rewrite_module 是标识符,mod_rewrite.c 是文件名。如果模块包含多个源文件,请使用包含字符串 STANDARD20_MODULE_STUFF 的文件名称。

<IfModule> 部分可以嵌套,可用于实现简单的多模块测试。

仅当您需要一个无论特定模块是否可用都能正常工作的配置文件时,才应使用此部分。在正常操作中,指令无需放在 <IfModule> 部分中。
top

<IfSection> 指令

描述包含在特定部分指令存在或不存在的情况下处理的指令
语法<IfSection [!]section-name> ... </IfSection>
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 2.4.34 及更高版本中可用。

<IfSection test>...</IfSection> 部分用于标记在特定部分指令存在的情况下处理的指令。部分指令是包含其他指令的任何指令,例如 <VirtualHost>,并且具有以“<”开头的指令名称。

<IfSection> 部分内的指令仅在 test 为 true 时处理。如果 test 为 false,则忽略开始标记和结束标记之间的所有内容。

必须在不带前导“<”或结束“>”的情况下指定 section-name<IfSection> 部分中的 test 可以采用以下两种形式之一

在前一种情况下,仅在处理时存在给定名称的部分指令时,才会处理开始标记和结束标记之间的指令。第二种格式会反转测试,并且仅在 section-name 不是可用部分指令时才处理指令。

例如

<IfSection VirtualHost>
   ...
</IfSection>
仅当您需要一个适用于多个版本的 httpd 的配置文件时,才应使用此部分,而不管是否存在特定部分指令。在正常操作中,无需将指令放在 <IfSection> 部分中。

另请参阅

top

Include 指令

描述从服务器配置文件中包含其他配置文件
语法Include file-path|directory-path|wildcard
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性2.3.6 及更高版本中提供目录通配符匹配

此指令允许从服务器配置文件中包含其他配置文件。

可以在路径的文件名或目录部分中使用 Shell 风格(fnmatch())通配符字符,以按字母顺序同时包含多个文件。此外,如果 Include 指向目录而不是文件,则 Apache httpd 将读取该目录和任何子目录中的所有文件。但是,不建议包含整个目录,因为很容易在目录中意外留下临时文件,从而导致 httpd 失败。相反,我们建议您使用下面所示的通配符语法,以包含与特定模式匹配的文件,例如 *.conf。

如果通配符表达式与任何文件不匹配,则 Include 指令将失败并显示错误。如果应忽略不匹配的通配符,可以使用 IncludeOptional 指令。

指定的文件路径可以是绝对路径,也可以相对于 ServerRoot 目录。

示例

Include /usr/local/apache2/conf/ssl.conf
Include /usr/local/apache2/conf/vhosts/*.conf

或者,提供相对于 ServerRoot 目录的路径

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

通配符可以包含在路径的目录或文件部分中。如果 conf/vhosts 中没有至少包含一个 *.conf 文件的子目录,则此示例将失败

Include conf/vhosts/*/*.conf

或者,在缺少文件或目录的情况下,将忽略以下命令

IncludeOptional conf/vhosts/*/*.conf

另请参阅

top

IncludeOptional 指令

描述从服务器配置文件中包含其他配置文件
语法IncludeOptional file-path|directory-path|wildcard
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性在 2.3.6 及更高版本中提供。在 2.4.30 之后,没有通配符的不存在文件路径不会导致 SyntaxError

此指令允许从服务器配置文件中包含其他配置文件。它的工作方式与 Include 指令相同,但如果使用通配符并且它们与任何文件或目录不匹配,或者文件路径在文件系统上不存在,则它将被静默忽略(而不是导致错误)。

另请参阅

top

KeepAlive 指令

描述启用 HTTP 持久连接
语法保持活动状态 开|关
默认保持活动状态 开
上下文服务器配置、虚拟主机
状态核心
模块核心

HTTP/1.0 的 Keep-Alive 扩展和 HTTP/1.1 的持久连接功能提供长期 HTTP 会话,允许通过相同的 TCP 连接发送多个请求。在某些情况下,这已被证明可以将包含许多图像的 HTML 文档的延迟时间缩短近 50%。要启用 Keep-Alive 连接,请设置 KeepAlive On

对于 HTTP/1.0 客户端,只有当客户端明确请求时,才会使用 Keep-Alive 连接。此外,只有在提前知道内容长度时,才能使用与 HTTP/1.0 客户端的 Keep-Alive 连接。这意味着动态内容(例如 CGI 输出、SSI 页面和服务器生成的目录列表)通常不会对 HTTP/1.0 客户端使用 Keep-Alive 连接。对于 HTTP/1.1 客户端,除非另有说明,否则持久连接是默认值。如果客户端请求,将使用分块编码通过持久连接发送未知长度的内容。

当客户端使用 Keep-Alive 连接时,它将被视为 MaxConnectionsPerChild 指令的单个“请求”,无论使用该连接发送了多少个请求。

另请参阅

top

KeepAliveTimeout 指令

描述服务器在持久连接上等待后续请求的时间量
语法KeepAliveTimeout num[ms]
默认KeepAliveTimeout 5
上下文服务器配置、虚拟主机
状态核心
模块核心

Apache httpd 等待后续请求关闭连接之前等待的秒数。通过添加 ms 后缀,也可以将超时设置为毫秒。一旦收到请求,将应用 Timeout 指令指定的超时值。

KeepAliveTimeout 设置为高值可能会导致负载较重的服务器出现性能问题。超时时间越长,服务器进程等待空闲客户端连接所占用的时间就越多。

如果未为基于名称的虚拟主机设置 KeepAliveTimeout,将使用与本地 IP 和端口最匹配的第一个已定义虚拟主机的值。

top

<Limit> 指令

描述将封闭的访问控制仅限制为某些 HTTP 方法
语法<Limit method [method] ... > ... </Limit>
上下文目录,.htaccess
覆盖AuthConfig、Limit
状态核心
模块核心

访问控制通常对所有访问方法有效,这是通常期望的行为。在一般情况下,不应将访问控制指令放在 <Limit> 部分中。

<Limit> 指令的目的是将访问控制的效果限制为指定的 HTTP 方法。对于所有其他方法,封闭在 <Limit> 括号中的访问限制将不起作用。以下示例仅将访问控制应用于 POSTPUTDELETE 方法,使所有其他方法不受保护

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

列出的方法名称可以是以下一个或多个:GETPOSTPUTDELETECONNECTOPTIONSPATCHPROPFINDPROPPATCHMKCOLCOPYMOVELOCKUNLOCK方法名称区分大小写。如果使用 GET,它还将限制 HEAD 请求。TRACE 方法不能被限制(参见 TraceEnable)。

限制访问时,应始终优先使用 <LimitExcept> 部分而不是 <Limit> 部分,因为 <LimitExcept> 部分可防止任意方法。

<Limit><LimitExcept> 指令可以嵌套。在这种情况下,<Limit><LimitExcept> 指令的每个连续级别都必须进一步限制访问控制适用的方法集。

在将 <Limit><LimitExcept> 指令与 Require 指令配合使用时,请注意,第一个 Require 成功授权请求,而不管其他 Require 指令是否存在。

例如,根据以下配置,所有用户都将被授权进行 POST 请求,并且在所有情况下都将忽略 Require group editors 指令

<LimitExcept GET>
  Require valid-user
</LimitExcept>
<Limit POST>
  Require group editors
</Limit>
top

<LimitExcept> 指令

描述将访问控制限制为除指定方法之外的所有 HTTP 方法
语法<LimitExcept method [method] ... > ... </LimitExcept>
上下文目录,.htaccess
覆盖AuthConfig、Limit
状态核心
模块核心

<LimitExcept></LimitExcept> 用于包含一组访问控制指令,这些指令随后将应用于参数中未列出的任何 HTTP 访问方法;也就是说,它与 <Limit> 部分相反,并且可用于控制标准和非标准/未识别方法。有关详细信息,请参阅 <Limit> 的文档。

例如

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

LimitInternalRecursion 指令

描述确定内部重定向和嵌套子请求的最大数量
语法LimitInternalRecursion number [number]
默认LimitInternalRecursion 10
上下文服务器配置、虚拟主机
状态核心
模块核心

例如,在使用 Action 指令时,会发生内部重定向,该指令在内部将原始请求重定向到 CGI 脚本。子请求是 Apache httpd 的机制,用于找出在请求某些 URI 时会发生什么。例如,mod_dir 使用子请求查找 DirectoryIndex 指令中列出的文件。

LimitInternalRecursion 可防止服务器在进入内部重定向或子请求的无限循环时崩溃。此类循环通常由错误配置引起。

该指令存储两个不同的限制,它们在每个请求的基础上进行评估。第一个 number 是可能连续发生的内部重定向的最大数量。第二个 number 确定子请求可以嵌套的深度。如果您只指定一个 number,它将被分配给这两个限制。

LimitInternalRecursion 5
top

LimitRequestBody 指令

描述限制从客户端发送的 HTTP 请求正文的总大小
语法LimitRequestBody bytes
默认LimitRequestBody 1073741824
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心
兼容性在 Apache HTTP Server 2.4.53 及更早版本中,默认值为 0(无限制)

此指令指定请求正文中允许的 bytes 数量。0 的值表示无限制。

LimitRequestBody 指令允许用户在给定指令的上下文中(服务器、每个目录、每个文件或每个位置)设置对允许的 HTTP 请求消息正文大小的限制。如果客户端请求超过该限制,服务器将返回错误响应,而不是处理请求。正常请求消息正文的大小将根据资源的性质和该资源上允许的方法而有很大差异。CGI 脚本通常使用消息正文来检索表单信息。PUT 方法的实现将需要一个值,该值至少与服务器希望为该资源接受的任何表示一样大。

此指令使服务器管理员能够更好地控制异常的客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。

例如,如果您允许将文件上传到特定位置,并希望将上传文件的大小限制为 100K,则可以使用以下指令

LimitRequestBody 102400
top

LimitRequestFields 指令

描述限制客户端可接受的 HTTP 请求头字段数
语法LimitRequestFields number
默认LimitRequestFields 100
上下文服务器配置、虚拟主机
状态核心
模块核心

number 设置为 0 表示不限。默认值由编译时常量 DEFAULT_LIMIT_REQUEST_FIELDS 定义(已发布的版本为 100)。

服务器管理员可使用 LimitRequestFields 指令修改 HTTP 请求中允许的请求头字段数限制。服务器需要此值大于普通客户端请求可能包含的字段数。客户端使用的请求头字段数很少会超过 20,但不同客户端实现之间可能有所不同,通常取决于用户配置其浏览器以支持详细内容协商的程度。可选 HTTP 扩展通常使用请求头字段表示。

此指令使服务器管理员能够更好地控制异常客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。如果普通客户端从服务器看到错误响应,表明请求中发送的字段过多,则应增加此值。

例如

LimitRequestFields 50

警告

当使用基于名称的虚拟主机时,此指令的值取自本地 IP 和端口组合的默认(首选)虚拟主机。

top

LimitRequestFieldSize 指令

描述限制客户端允许的 HTTP 请求头大小
语法LimitRequestFieldSize bytes
默认LimitRequestFieldSize 8190
上下文服务器配置、虚拟主机
状态核心
模块核心

此指令指定 HTTP 请求头中允许的 bytes 数。

服务器管理员可使用 LimitRequestFieldSize 指令设置 HTTP 请求头字段允许大小的限制。服务器需要此值足够大,以便容纳普通客户端请求中的任何一个头字段。普通请求头字段的大小在不同的客户端实现之间会有很大差异,通常取决于用户配置其浏览器以支持详细内容协商的程度。SPNEGO 身份验证头最多可达 12392 字节。

此指令使服务器管理员能够更好地控制异常的客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。

例如

LimitRequestFieldSize 4094
在正常情况下,不应更改此值(使用默认值)。

警告

当使用基于名称的虚拟主机时,此指令的值取自与当前 IP 地址和端口组合最匹配的默认(首选)虚拟主机。

top

LimitRequestLine 指令

描述限制客户端可接受的 HTTP 请求行大小
语法LimitRequestLine bytes
默认LimitRequestLine 8190
上下文服务器配置、虚拟主机
状态核心
模块核心

此指令设置 HTTP 请求行允许的 bytes 数。

使用 LimitRequestLine 指令,服务器管理员可以设置限制,以限制客户端 HTTP 请求行允许的大小。由于请求行包含 HTTP 方法、URI 和协议版本,因此 LimitRequestLine 指令对服务器上请求允许的请求 URI 的长度施加限制。服务器需要此值足够大,以容纳其任何资源名称,包括在 GET 请求的查询部分中可能传递的任何信息。

此指令使服务器管理员能够更好地控制异常的客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。

例如

LimitRequestLine 4094
在正常情况下,不应更改此值(使用默认值)。

警告

当使用基于名称的虚拟主机时,此指令的值取自与当前 IP 地址和端口组合最匹配的默认(首选)虚拟主机。

top

LimitXMLRequestBody 指令

描述限制基于 XML 的请求正文的大小
语法LimitXMLRequestBody bytes
默认LimitXMLRequestBody 1000000
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

基于 XML 的请求正文的最大大小的限制(以字节为单位)。值为 0 将应用硬限制(取决于 32 位与 64 位系统),允许在系统可寻址内存的范围内进行 XML 转义,但它仅出于兼容性而存在,不建议使用,因为它不考虑在其他地方或并发请求中消耗的内存,这可能会导致整个系统内存不足。

示例

# Limit of 1 MiB
LimitXMLRequestBody 1073741824
top

<Location> 指令

描述仅将所附指令应用于匹配的 URL
语法<Location URL-path|URL> ... </Location>
上下文服务器配置、虚拟主机
状态核心
模块核心

<Location> 指令通过 URL 限制所附指令的范围。它类似于 <Directory> 指令,并启动一个子部分,该子部分以 </Location> 指令终止。<Location> 部分按它们在配置文件中出现的顺序进行处理,在读取 <Directory> 部分和 .htaccess 文件后以及在读取 <Files> 部分后进行处理。

<Location> 部分完全在文件系统外部运行。这有几个后果。最重要的是,<Location> 指令不应用于控制对文件系统位置的访问。由于多个不同的 URL 可能映射到相同的文件系统位置,因此此类访问控制可能会被规避。

如果 URL 的路径组件满足以下任何条件,则所附指令将应用于请求

在以下示例中,未使用尾随斜杠,对 /private1、/private1/ 和 /private1/file.txt 的请求将应用所附指令,但 /private1other 不会。

<Location "/private1">
    #  ...
</Location>

在以下示例中,使用了尾随斜杠,对 /private2/ 和 /private2/file.txt 的请求将应用所附指令,但 /private2 和 /private2other 不会。

<Location "/private2/">
    # ...
</Location>

何时使用 <Location>

使用 <Location> 将指令应用于存在于文件系统外部的内容。对于存在于文件系统中的内容,请使用 <Directory><Files>。例外是 <Location "/">,这是将配置应用于整个服务器的简单方法。

对于所有来源(非代理)请求,要匹配的 URL 是形式为 /path/ 的 URL 路径。不得包含方案、主机名、端口或查询字符串。对于代理请求,要匹配的 URL 形式为 scheme://servername/path,并且您必须包含前缀。

URL 可以使用通配符。在通配符字符串中,? 匹配任何单个字符,* 匹配任何字符序列。在 URL 路径中,这两个通配符都不匹配 /。

正则表达式也可以使用,并添加 ~ 字符。例如

<Location ~ "/(extra|special)/data">
    #...
</Location>

将匹配包含子字符串 /extra/data/special/data 的 URL。指令 <LocationMatch> 的行为与 <Location> 的正则表达式版本相同,并且更受青睐,原因很简单,在许多字体中 ~ 很难与 - 区分。

当与 SetHandler 指令结合使用时,<Location> 功能特别有用。例如,要启用状态请求,但只允许来自 example.com 上的浏览器的请求,您可以使用

<Location "/status">
  SetHandler server-status
  Require host example.com
</Location>

关于 /(斜杠)的说明

斜杠字符具有特殊含义,具体取决于它在 URL 中出现的位置。人们可能习惯于它在文件系统中的行为,在文件系统中,相邻的多个斜杠经常折叠成一个斜杠(/home///foo/home/foo 相同)。在 URL 空间中,如果指令 MergeSlashes 已设置为“OFF”,则不一定如此。如果未合并斜杠,<LocationMatch> 指令和 <Location> 的正则表达式版本要求您显式指定多个斜杠。

例如,<LocationMatch "^/abc"> 将匹配请求 URL /abc,但不匹配请求 URL //abc。当用于代理请求时,(非正则表达式)<Location> 指令的行为类似。但是,当(非正则表达式)<Location> 用于非代理请求时,它将隐式地用一个斜杠匹配多个斜杠。例如,如果您指定 <Location "/abc/def"> 且请求为 /abc//def,则它将匹配。

另请参阅

top

<LocationMatch> 指令

描述仅将封闭的指令应用于正则表达式匹配的 URL
语法<LocationMatch regex> ... </LocationMatch>
上下文服务器配置、虚拟主机
状态核心
模块核心

<LocationMatch> 指令通过 URL 限制封闭指令的范围,与 <Location> 的方式相同。但是,它采用 正则表达式 作为参数,而不是简单的字符串。例如

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

将匹配包含子字符串 /extra/data/special/data 的 URL。

如果意图是 URL /extra/data 开头,而不是仅仅包含 /extra/data,则在正则表达式前加上 ^ 以要求这样做。

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

从 2.4.8 开始,命名的组和反向引用会被捕获并写入环境,对应的名称前缀为“MATCH_”,并大写。这允许从 表达式mod_rewrite 等模块中引用 URL 的元素。为了防止混淆,已忽略编号的(未命名的)反向引用。请改用命名的组。

<LocationMatch "^/combined/(?<sitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>

关于 /(斜杠)的说明

斜杠字符具有特殊含义,具体取决于它在 URL 中出现的位置。人们可能习惯于它在文件系统中的行为,在文件系统中,相邻的多个斜杠经常折叠成一个斜杠(/home///foo/home/foo 相同)。在 URL 空间中,如果指令 MergeSlashes 已设置为“OFF”,则不一定如此。如果未合并斜杠,<LocationMatch> 指令和 <Location> 的正则表达式版本要求您显式指定多个斜杠。

例如,<LocationMatch "^/abc"> 将匹配请求 URL /abc,但不匹配请求 URL //abc。当用于代理请求时,(非正则表达式)<Location> 指令的行为类似。但是,当(非正则表达式)<Location> 用于非代理请求时,它将隐式地用一个斜杠匹配多个斜杠。例如,如果您指定 <Location "/abc/def"> 且请求为 /abc//def,则它将匹配。

另请参阅

top

LogLevel 指令

描述控制 ErrorLog 的详细程度
语法LogLevel [模块:]级别 [模块:级别] ...
默认LogLevel 警告
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性Apache HTTP Server 2.3.6 及更高版本提供按模块和按目录配置

LogLevel 调整记录在错误日志中的消息的详细程度(请参阅 ErrorLog 指令)。以下 级别 可用,按重要性递减排列

级别 描述 示例
紧急 紧急情况 - 系统不可用。 "子进程无法打开锁定文件。正在退出"
警报 必须立即采取行动。 "getpwuid: 无法从 uid 确定用户名"
严重 严重情况。 "套接字:无法获取套接字,正在退出子进程"
错误 错误情况。 "脚本头过早结束"
警告 警告情况。 "子进程 1234 未退出,正在发送另一个 SIGHUP"
通知 正常但重要的情况。 "httpd: 捕获到 SIGBUS,尝试在 ... 中转储核心"
信息 信息。 "服务器似乎很忙,(您可能需要增加 StartServers 或 Min/MaxSpareServers)..."
调试 调试级别消息 "正在打开配置文件 ..."
跟踪 1 跟踪消息 "代理:FTP:控制连接完成"
跟踪 2 跟踪消息 "代理:CONNECT:向远程代理发送 CONNECT 请求"
跟踪 3 跟踪消息 "openssl:握手:开始"
跟踪 4 跟踪消息 "从缓冲的 SSL 旅读入,模式 0,17 字节"
跟踪 5 跟踪消息 "映射查找失败:映射=重写映射键=键名"
跟踪 6 跟踪消息 "缓存查找失败,强制进行新的映射查找"
跟踪 7 跟踪消息,转储大量数据 "| 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"
跟踪 8 跟踪消息,转储大量数据 "| 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"

当指定特定级别时,也会报告所有其他更高重要性级别的消息。例如,当指定 LogLevel info 时,也会发布日志级别为 noticewarn 的消息。

建议使用至少 crit 级别。

例如

LogLevel notice

注意

当记录到常规文件时,无法抑制级别为 notice 的消息,因此始终记录这些消息。但是,当使用 syslog 记录时,这不适用。

指定一个没有模块名称的级别将把所有模块的级别重置为该级别。指定一个带有模块名称的级别将仅设置该模块的级别。可以将模块源文件名、模块标识符或省略尾随 _module 的模块标识符用作模块规范。这意味着以下三个规范是等效的

LogLevel info ssl:warn
LogLevel info mod_ssl.c:warn
LogLevel info ssl_module:warn

也可以按目录更改级别

LogLevel info
<Directory "/usr/local/apache/htdocs/app">
  LogLevel debug
</Directory>
按目录记录级别配置仅影响在解析请求后记录并与请求关联的消息。与连接或服务器关联的日志消息不受影响。

另请参阅

top

MaxKeepAliveRequests 指令

描述持久连接上允许的请求数
语法MaxKeepAliveRequests 数字
默认MaxKeepAliveRequests 100
上下文服务器配置、虚拟主机
状态核心
模块核心

KeepAlive 处于启用状态时,MaxKeepAliveRequests 指令限制每个连接允许的请求数。如果将其设置为 0,则允许无限请求。我们建议将此设置保持在较高值,以获得最大的服务器性能。

例如

MaxKeepAliveRequests 500
top

MaxRangeOverlaps 指令

描述允许的重叠范围数(例如:100-200,150-300),在返回完整资源之前
语法MaxRangeOverlaps 默认值 | 无限制 | 无 | 范围数
默认MaxRangeOverlaps 20
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性适用于 Apache HTTP Server 2.3.15 及更高版本

MaxRangeOverlaps 指令限制服务器愿意返回给客户端的重叠 HTTP 范围数。如果请求的重叠范围数超过允许范围,则会返回完整资源。

默认值
将重叠范围数限制为编译时默认值 20。
不允许重叠 Range 标头。
无限制
服务器不限制其愿意满足的重叠范围数。
范围数
表示服务器愿意满足的最大重叠范围数的正数。
top

MaxRangeReversals 指令

描述允许的范围反转数(例如:100-200,50-70),在返回完整资源之前
语法MaxRangeReversals 默认值 | 无限制 | 无 | 范围数
默认MaxRangeReversals 20
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性适用于 Apache HTTP Server 2.3.15 及更高版本

MaxRangeReversals 指令限制服务器愿意返回给客户端的 HTTP 范围反转数。如果请求的范围反转数超过允许范围,则会返回完整资源。

默认值
将范围反转数限制为编译时默认值 20。
不允许范围反转标头。
无限制
服务器不限制其愿意满足的范围反转数。
范围数
表示服务器愿意满足的最大范围反转数的正数。
top

MaxRanges 指令

描述允许的范围数,在返回完整资源之前
语法MaxRanges 默认值 | 无限制 | 无 | 范围数
默认MaxRanges 200
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性适用于 Apache HTTP Server 2.3.15 及更高版本

MaxRanges 指令限制服务器愿意返回给客户端的 HTTP 范围数。如果请求的范围数超过允许范围,则会返回完整资源。

默认值
将范围数限制为编译时默认值 200。
忽略范围标头。
无限制
服务器不限制其愿意满足的范围数。
范围数
表示服务器愿意满足的最大范围数的正数。
top

MergeSlashes 指令

描述控制服务器是否合并 URL 中连续的斜杠。
语法MergeSlashes ON|OFF
默认MergeSlashes ON
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性在 2.4.39 中添加

默认情况下,服务器合并(或折叠)请求 URL 路径组件中的多个连续斜杠('/')字符。

在将 URL 映射到文件系统时,这些多个斜杠并不重要。但是,通过 CGI 或代理等其他方式处理的 URL 可能更愿意保留多个连续斜杠的意义。在这些情况下,可以将 MergeSlashes 设置为 OFF 以保留多个连续斜杠,这是传统行为。

当设置为“OFF”时,配置文件中用于匹配 URL 路径组件的正则表达式(LocationMatchRewriteRule 等)需要考虑多个连续斜杠。基于非正则表达式的 Location 始终针对合并斜杠的 URL 运行,并且无法区分多个斜杠。

top

MergeTrailers 指令

描述确定是否将拖尾合并到标头中
语法MergeTrailers [on|off]
默认MergeTrailers off
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性2.4.11 及更高版本

此指令控制是否将 HTTP 拖尾复制到 HTTP 标头的内部表示中。此合并发生在请求正文完全使用后,在大多数标头处理有机会检查或修改请求标头之后很长时间。

提供此选项是为了与 2.4.11 之前的版本兼容,在这些版本中始终合并拖尾。

top

Mutex 指令

描述为所有或指定的互斥锁配置互斥锁机制和锁定文件目录
语法Mutex mechanism [default|mutex-name] ... [OmitPID]
默认Mutex default
上下文服务器配置
状态核心
模块核心
兼容性适用于 Apache HTTP Server 2.3.4 及更高版本

Mutex 指令设置 httpd 和模块用于序列化对资源的访问的机制,还可以设置锁定文件位置。将 default 指定为第二个参数以更改所有互斥锁的设置;将互斥锁名称(见下表)指定为第二个参数以仅覆盖该互斥锁的默认值。

Mutex 指令通常用于以下特殊情况

支持的模块

此指令仅配置已使用 ap_mutex_register() API 向核心服务器注册的互斥锁。与 httpd 捆绑的所有模块都支持 Mutex 指令,但第三方模块可能不支持。查阅第三方模块的文档,该文档必须指出如果支持此指令,可以配置哪些互斥锁名称。

以下互斥锁机制可用

大多数机制仅在选定的平台上可用,其中基础平台和 APR 支持它。在所有平台上都不可用的机制包括 posixsemsysvsemsempthreadfcntlflockfile

对于基于文件的机制 fcntlflock,如果提供了路径,则该路径是将创建锁定文件的目录。默认目录是相对于 ServerRoot 的 httpd 运行时文件目录。始终为 /path/to/mutex 使用本地磁盘文件系统,切勿使用驻留在 NFS 或 AFS 文件系统上的目录。文件的基本名称将是互斥锁类型、模块提供的可选实例字符串,并且除非指定了 OmitPID 关键字,否则将附加 httpd 父进程的进程 ID 以使文件名唯一,从而避免当多个 httpd 实例共享锁定文件目录时发生冲突。例如,如果互斥锁名称为 mpm-accept 且锁定文件目录为 /var/httpd/locks,则父进程 ID 为 12345 的 httpd 实例的锁定文件名将为 /var/httpd/locks/mpm-accept.12345

安全性

最好避免将互斥锁文件放在诸如 /var/tmp 之类的可世界写入的目录中,因为有人可以通过创建与服务器将尝试创建的文件同名的锁定文件来创建拒绝服务攻击并阻止服务器启动。

下表记录了 httpd 和捆绑模块使用的互斥锁名称。

互斥锁名称 模块 受保护资源
mpm-accept preforkworker MPM 传入连接,以避免惊群问题;有关更多信息,请参阅 性能调整 文档
authdigest-client mod_auth_digest 共享内存中的客户端列表
authdigest-opaque mod_auth_digest 共享内存中的计数器
ldap-cache mod_ldap LDAP 结果缓存
rewrite-map mod_rewrite 与外部映射程序通信,以避免来自多个请求的混合 I/O
ssl-cache mod_ssl SSL 会话缓存
ssl-stapling mod_ssl OCSP 装订响应缓存
watchdog-callback mod_watchdog 特定客户端模块的回调函数

OmitPID 关键字禁止在锁定文件名中添加 httpd 父进程 ID。

在以下示例中,MPM 接受互斥锁的互斥机制将从编译时默认值更改为 fcntl,关联的锁定文件将在目录 /var/httpd/locks 中创建。所有其他互斥锁的互斥机制将从编译时默认值更改为 sysvsem

Mutex sysvsem default
Mutex fcntl:/var/httpd/locks mpm-accept
top

NameVirtualHost 指令

描述已弃用:指定名称虚拟主机的 IP 地址
语法NameVirtualHost addr[:port]
上下文服务器配置
状态核心
模块核心

在 2.3.11 之前,需要 NameVirtualHost 指示服务器某个特定 IP 地址和端口组合可用作基于名称的虚拟主机。在 2.3.11 及更高版本中,任何时候在多个虚拟主机中使用 IP 地址和端口组合,都会自动为该地址启用基于名称的虚拟主机。

此指令当前没有任何效果。

另请参阅

top

Options 指令

描述配置特定目录中可用的功能
语法Options [+|-]option [[+|-]option] ...
默认Options FollowSymlinks
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖选项
状态核心
模块核心
兼容性默认值已在 2.3.11 中从 All 更改为 FollowSymlinks

Options 指令控制特定目录中可用的服务器功能。

option 可以设置为 None,在这种情况下,不会启用任何额外功能,或以下一项或多项

全部
MultiViews 之外的所有选项。
ExecCGI
允许使用 mod_cgi 执行 CGI 脚本。
FollowSymLinks
服务器将遵循此目录中的符号链接。这是默认设置。

即使服务器遵循符号链接,它也不会更改用于与 <Directory> 部分匹配的路径名。

FollowSymLinksSymLinksIfOwnerMatch Options 仅在 <Directory> 部分或 .htaccess 文件中起作用。

不选择此选项不应被视为安全限制,因为符号链接测试会受到竞态条件的影响,这会使其可被规避。

Includes
允许 mod_include 提供的服务器端包含。
IncludesNOEXEC
允许服务器端包含,但禁用 #exec cmd#exec cgi。仍然可以从 ScriptAliased 目录中#include virtual CGI 脚本。
索引
如果请求映射到目录的 URL,并且该目录中没有 DirectoryIndex例如index.html),那么 mod_autoindex 将返回该目录的格式化列表。
MultiViews
可以使用 mod_negotiation 允许“MultiViews”进行 内容协商

注意

如果在 <Directory> 之外的任何地方设置此选项,则此选项将被忽略,因为 mod_negotiation 需要比较和评估的真实资源。

SymLinksIfOwnerMatch
服务器只会跟踪目标文件或目录归属于与链接相同的用户 ID 的符号链接。

注意

FollowSymLinksSymLinksIfOwnerMatch Options 仅在 <Directory> 部分或 .htaccess 文件中起作用。

此选项不应被视为安全限制,因为符号链接测试受竞争条件影响,这使其可被规避。

通常,如果多个 Options 可以应用于目录,则使用最具体的选项并忽略其他选项;这些选项不会合并。(请参阅 如何合并部分。)但是,如果 Options 指令上的所有选项之前都有一个 +- 符号,则这些选项将合并。任何之前有 + 的选项都会添加到当前生效的选项中,任何之前有 - 的选项都会从当前生效的选项中删除。

注意

将带有 +-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 会完全禁用服务器端包含,而不管之前的设置如何。

在没有其他设置的情况下,默认值为 FollowSymlinks

top

Protocol 指令

描述用于侦听套接字的协议
语法Protocol protocol
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性在 Apache 2.1.5 及更高版本中可用。在 Windows 上,从 Apache 2.3.3 及更高版本可用。

此指令指定用于特定侦听套接字的协议。协议用于确定哪个模块应处理请求,并使用 AcceptFilter 指令应用特定于协议的优化。

大多数配置不需要此指令。如果未指定,则端口 443 的默认值为 https,所有其他端口的默认值为 http。协议用于确定哪个模块应处理请求,并使用 AcceptFilter 指令应用特定于协议的优化。

例如,如果你在非标准端口上运行 https,请明确指定协议

Protocol https

你还可以使用 Listen 指令指定协议。

另请参阅

top

Protocols 指令

描述服务器/虚拟主机的可用协议
语法协议 protocol ...
默认协议 http/1.1
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性仅在 Apache 2.4.17 及更高版本中可用。

此指令指定服务器/虚拟主机支持的协议列表。该列表确定客户端可以为此服务器/主机协商的允许协议。

如果您想扩展服务器/主机的可用协议,则需要设置协议。默认情况下,只允许 http/1.1 协议(包括与 1.0 和 0.9 客户端的兼容性)。

例如,如果您想为具有 TLS 的服务器支持 HTTP/2,请指定

Protocols h2 http/1.1

有效的协议是 http/1.1(用于 http 和 https 连接)、h2(用于 https 连接)和 h2c(用于 http 连接)。模块可以启用更多协议。

指定不可用/已禁用的协议是安全的。此类协议名称将被忽略。

仅当虚拟主机没有自己的 Protocols 指令时,才会从基本服务器中指定的协议继承到虚拟主机。或者,反过来,虚拟主机中的 Protocols 指令将替换基本服务器中的任何此类指令。

另请参阅

top

ProtocolsHonorOrder 指令

描述确定 Protocols 的顺序是否决定协商期间的优先级
语法ProtocolsHonorOrder On|Off
默认ProtocolsHonorOrder On
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性仅在 Apache 2.4.17 及更高版本中可用。

此指令指定服务器是否应遵循 Protocols 指令列出协议的顺序。

如果配置为 Off,则客户端提供的协议列表顺序优先于服务器配置中的顺序。

ProtocolsHonorOrder 设置为 on(默认值)时,客户端排序无关紧要,只有服务器设置中的排序才会影响协议协商的结果。

另请参阅

top

QualifyRedirectURL 指令

描述控制 REDIRECT_URL 环境变量是否完全限定
语法QualifyRedirectURL On|Off
默认QualifyRedirectURL Off
上下文服务器配置、虚拟主机、目录
覆盖FileInfo
状态核心
模块核心
兼容性2.4.18 及更高版本中支持的指令。2.4.17 的行为如同配置了“QualifyRedirectURL On”。

此指令控制服务器是否将确保 REDIRECT_URL 环境变量完全限定。默认情况下,该变量包含客户端请求的逐字 URL,例如“/index.html”。使用 QualifyRedirectURL On 时,相同的请求将导致一个值,例如“http://www.example.com/index.html”。

即使未设置此指令,当针对完全限定的 URL 发出请求时,REDIRECT_URL 仍将保持完全限定。

top

ReadBufferSize 指令

描述用于读取数据的缓冲区大小
语法ReadBufferSize bytes
默认ReadBufferSize 8192
上下文服务器配置、虚拟主机、目录
状态核心
模块核心
兼容性2.4.27 及更高版本

此指令允许配置用于从网络或文件中读取数据时使用的内存缓冲区的大小(以字节为单位)。

较大的缓冲区可以提高处理较大数据时的性能,但会消耗每个连接更多的内存。可配置的最小大小为 1024

top

RegexDefaultOptions 指令

描述允许为正则表达式配置全局/默认选项
语法RegexDefaultOptions [none] [+|-]选项 [[+|-]选项] ...
默认RegexDefaultOptions DOTALL DOLLAR_ENDONLY
上下文服务器配置
状态核心
模块核心
兼容性仅适用于 Apache 2.4.30 及更高版本。

此指令为随后使用的任何正则表达式添加一些默认行为。

任何带有“+”前缀的选项都会添加到已设置的选项中。
任何带有“-”前缀的选项都会从已设置的选项中移除。
任何没有“+”或“-”的选项都会被设置,移除任何其他已设置的选项。
none 关键字会重置任何已设置的选项。

选项 可以是

ICASE
使用不区分大小写的匹配。
EXTENDED
Perl 的 /x 标志,忽略模式中的(未转义的)空格和注释。
DOTALL
Perl 的 /s 标志,'.' 匹配换行符。
DOLLAR_ENDONLY
'$' 仅在主题字符串末尾匹配。
# Add the ICASE option for all regexes by default
RegexDefaultOptions +ICASE
...
# Remove the default DOLLAR_ENDONLY option, but keep any other one
RegexDefaultOptions -DOLLAR_ENDONLY
...
# Set the DOTALL option only, resetting any other one
RegexDefaultOptions DOTALL
...
# Reset all defined options
RegexDefaultOptions none
...
top

RegisterHttpMethod 指令

描述注册非标准 HTTP 方法
语法RegisterHttpMethod 方法 [方法 [...]]
上下文服务器配置
状态核心
模块核心
兼容性适用于 Apache HTTP Server 2.4.24 及更高版本

此指令可用于注册其他 HTTP 方法。如果需要将非标准方法与接受方法名称作为参数的指令一起使用,或者当服务器配置为仅向模块传递已识别的方法时,允许通过代理或 CGI 脚本使用特定的非标准方法,则需要这样做。

另请参阅

top

RLimitCPU 指令

描述限制 Apache httpd 子进程启动的进程的 CPU 消耗
语法RLimitCPU 秒数|max [秒数|max]
默认未设置;使用操作系统默认值
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

采用 1 个或 2 个参数。第一个参数为所有进程设置软资源限制,第二个参数设置最大资源限制。任一参数都可以是数字,也可以是 max,向服务器指示应将限制设置为操作系统配置允许的最大值。提高最大资源限制要求服务器以 root 身份或在初始启动阶段运行。

这适用于从 Apache httpd 子进程派生的处理请求的进程,而不是 Apache httpd 子进程本身。这包括 CGI 脚本和 SSI exec 命令,但不包括从 Apache httpd 父进程派生的任何进程,例如管道日志。

CPU 资源限制以每个进程的秒数表示。

另请参阅

top

RLimitMEM 指令

描述限制 Apache httpd 子进程启动的进程的内存消耗
语法RLimitMEM 字节|max [字节|max]
默认未设置;使用操作系统默认值
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

采用 1 个或 2 个参数。第一个参数为所有进程设置软资源限制,第二个参数设置最大资源限制。任一参数都可以是数字,也可以是 max,向服务器指示应将限制设置为操作系统配置允许的最大值。提高最大资源限制要求服务器以 root 身份或在初始启动阶段运行。

这适用于从 Apache httpd 子进程派生的处理请求的进程,而不是 Apache httpd 子进程本身。这包括 CGI 脚本和 SSI exec 命令,但不包括从 Apache httpd 父进程派生的任何进程,例如管道日志。

内存资源限制以每个进程的字节数表示。

另请参阅

top

RLimitNPROC 指令

描述限制 Apache httpd 子进程启动的进程可以启动的进程数
语法RLimitNPROC 数字|max [数字|max]
默认未设置;使用操作系统默认值
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

采用 1 或 2 个参数。第一个参数为所有进程设置软资源限制,第二个参数为最大资源限制。任一参数均可为数字,或 max,以指示服务器应将限制设置为操作系统配置允许的最大值。提高最大资源限制要求服务器以 root 身份或在初始启动阶段运行。

这适用于从 Apache httpd 子进程派生的处理请求的进程,而不是 Apache httpd 子进程本身。这包括 CGI 脚本和 SSI exec 命令,但不包括从 Apache httpd 父进程派生的任何进程,例如管道日志。

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

注意

如果 CGI 进程在 Web 服务器用户 ID 以外的用户 ID 下运行,此指令将限制服务器本身可创建的进程数。error_log 中的 cannot fork 消息将表明此情况的证据。

另请参阅

top

ScriptInterpreterSource 指令

描述用于查找 CGI 脚本解释器的技术
语法ScriptInterpreterSource Registry|Registry-Strict|Script
默认ScriptInterpreterSource Script
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性仅适用于 Win32。

此指令用于控制 Apache httpd 如何查找用于运行 CGI 脚本的解释器。默认设置为 Script。这将导致 Apache httpd 使用脚本中 shebang 行(第一行,以 #! 开头)指向的解释器。在 Win32 系统上,此行通常看起来像

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

或者,如果 perlPATH 中,则只需

#!perl

设置 ScriptInterpreterSource Registry 将导致使用脚本文件扩展名(例如,.pl)作为搜索键来搜索 Windows 注册表树 HKEY_CLASSES_ROOT。使用注册表子键 Shell\ExecCGI\Command 定义的命令,或者如果不存在,则使用子键 Shell\Open\Command 来打开脚本文件。如果找不到注册表键,Apache httpd 将回退到 Script 选项的行为。

安全性

使用 ScriptInterpreterSource RegistryScriptAlias'ed 目录时要小心,因为 Apache httpd 将尝试执行此目录中的每个文件。Registry 设置可能会导致对通常不执行的文件进行意外的程序调用。例如,大多数 Windows 系统上 .htm 文件的默认打开命令将执行 Microsoft Internet Explorer,因此对脚本目录中存在的 .htm 文件的任何 HTTP 请求都会在服务器上后台启动浏览器。这是在大约一分钟内使系统崩溃的好方法。

选项 Registry-Strict 执行与 Registry 相同的操作,但仅使用子键 Shell\ExecCGI\CommandExecCGI 键并不常见。它必须在 Windows 注册表中手动配置,因此可以防止在系统上意外调用程序。

top

SeeRequestTail 指令

描述确定 mod_status 显示请求的前 63 个字符还是后 63 个字符,假设请求本身大于 63 个字符。
语法SeeRequestTail On|Off
默认SeeRequestTail Off
上下文服务器配置
状态核心
模块核心
兼容性适用于 Apache httpd 2.2.7 及更高版本。

具有 ExtendedStatus Onmod_status 显示正在处理的实际请求。出于历史目的,实际上仅存储请求的前 63 个字符以供显示。此指令控制是否存储前 63 个字符(以前的默认行为)或存储后 63 个字符。当然,仅当请求长度为 64 个字符或更大时才适用此指令。

如果 Apache httpd 正在处理 GET /disk1/storage/apache/htdocs/images/imagestore1/food/apples.jpg HTTP/1.1,则 mod_status 显示如下

Off(默认) GET /disk1/storage/apache/htdocs/images/imagestore1/food/apples
On orage/apache/htdocs/images/imagestore1/food/apples.jpg HTTP/1.1
top

ServerAdmin 指令

描述服务器在发送给客户端的错误消息中包含的电子邮件地址
语法ServerAdmin email-address|URL
上下文服务器配置、虚拟主机
状态核心
模块核心

ServerAdmin 设置服务器在返回给客户端的任何错误消息中包含的联系地址。如果 httpd 未将提供的参数识别为 URL,它将假定该参数是 email-address,并在超链接目标中用 mailto: 为其添加前缀。但是,建议实际使用电子邮件地址,因为有很多 CGI 脚本会做出这样的假设。如果你想使用 URL,它应该指向你控制下的另一个服务器。否则,用户在出现错误时可能无法联系到你。

为此设置一个专用地址可能是值得的,例如

ServerAdmin [email protected]

因为用户并不总是提到他们正在谈论服务器!

top

ServerAlias 指令

描述在将请求与基于名称的虚拟主机匹配时用于主机的备用名称
语法ServerAlias hostname [hostname] ...
上下文虚拟主机
状态核心
模块核心

ServerAlias 指令为主机设置备用名称,以用于 基于名称的虚拟主机。如果合适,ServerAlias 可以包含通配符。

<VirtualHost *:80>
  ServerName server.example.com
  ServerAlias server server2.example.com server2
  ServerAlias *.example.com
  UseCanonicalName Off
  # ...
</VirtualHost>

针对最匹配的 <virtualhost> 集的基于名称的虚拟主机将按其在配置中出现的顺序进行处理。将使用第一个匹配的 ServerNameServerAlias,而通配符(或 ServerName 与 ServerAlias)没有不同的优先级。

<VirtualHost> 指令中的完整名称列表被视为一个(非通配符)ServerAlias

另请参阅

top

ServerName 指令

描述服务器用于标识自己的主机名和端口
语法ServerName [scheme://]domain-name|ip-address[:port]
上下文服务器配置、虚拟主机
状态核心
模块核心

ServerName 指令设置服务器用于标识自己的请求方案、主机名和端口。

当使用 基于名称的虚拟主机 时,ServerName 用于(可能与 ServerAlias 结合使用)唯一标识虚拟主机。

此外,当 UseCanonicalName 设置为非默认值时,在创建自引用重定向 URL 时也会使用它。

例如,如果托管 Web 服务器的机器名称为 simple.example.com,但该机器还具有 DNS 别名 www.example.com,并且你希望 Web 服务器被如此标识,则应使用以下指令

ServerName www.example.com

ServerName 指令可以出现在服务器定义中的任何位置。但是,每次出现都会覆盖之前的出现(在该服务器内)。

如果没有指定 ServerName,服务器将尝试通过首先向操作系统询问系统主机名来推断客户端可见的主机名,如果失败,则对系统上存在的 IP 地址执行反向查找。

如果在 ServerName 中未指定端口,则服务器将使用来自传入请求的端口。为了获得最佳的可靠性和可预测性,你应该使用 ServerName 指令指定显式的主机名和端口。

如果您正在使用基于名称的虚拟主机<VirtualHost>部分中的ServerName指定在请求的Host:头中必须显示什么主机名才能匹配此虚拟主机。

有时,服务器在处理 SSL 的设备(例如反向代理、负载平衡器或 SSL 卸载设备)后面运行。在这种情况下,在ServerName指令中指定https://方案和客户端连接到的端口号,以确保服务器生成正确的自引用 URL。

请参阅UseCanonicalNameUseCanonicalPhysicalPort指令的说明,了解确定自引用 URL(例如,mod_dir模块)将引用指定端口还是客户端请求中给出的端口号的设置。

如果未将ServerName设置为服务器可以解析为 IP 地址的名称,则会导致启动警告。然后,httpd将使用它可以确定的任何主机名,使用系统的hostname命令。这几乎永远不是您实际想要的主机名。

httpd:无法可靠地确定服务器的完全限定域名,使用 rocinante.local 作为 ServerName

另请参阅

top

ServerPath 指令

描述由不兼容的浏览器访问的基于名称的虚拟主机的旧版 URL 路径名
语法ServerPath URL-path
上下文虚拟主机
状态核心
模块核心

ServerPath指令为主机设置旧版 URL 路径名,以与基于名称的虚拟主机一起使用。

另请参阅

top

ServerRoot 指令

描述服务器安装的基本目录
语法ServerRoot directory-path
默认ServerRoot /usr/local/apache
上下文服务器配置
状态核心
模块核心

ServerRoot指令设置服务器所在的目录。通常它将包含子目录conf/logs/。其他配置指令中的相对路径(例如IncludeLoadModule)被视为相对于此目录的相对路径。

ServerRoot "/home/httpd"

可以使用--prefix参数修改ServerRoot的默认位置以configure,并且大多数服务器的第三方发行版的默认位置与上面列出的位置不同。

另请参阅

top

ServerSignature 指令

描述配置服务器生成文档上的页脚
语法ServerSignature On|Off|EMail
默认ServerSignature Off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖全部
状态核心
模块核心

ServerSignature指令允许配置服务器生成文档(错误消息、mod_proxyftp 目录列表、mod_info输出,...)下的尾部行。您希望启用此类尾部行的原因是,在代理链中,用户通常无法判断哪个链式服务器实际生成了返回的错误消息。

Off设置(默认设置)会禁止尾部行。On设置只会添加一行,其中包含服务器版本号和提供服务的虚拟主机的ServerName,而EMail设置还会创建对引用的文档的ServerAdmin的“mailto:”引用。

显示的服务器版本号的详细信息由 ServerTokens 指令控制。

另请参阅

top

ServerTokens 指令

描述配置 Server HTTP 响应头
语法ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
默认ServerTokens Full
上下文服务器配置
状态核心
模块核心

此指令控制发送回客户端的 Server 响应头字段是否包括服务器的通用操作系统类型描述以及已编译模块的信息。

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

此设置适用于整个服务器,不能逐个虚拟主机启用或禁用。

此指令还控制 ServerSignature 指令显示的信息。

不建议将 ServerTokens 设置为低于 minimal,因为它会增加调试互操作问题时的难度。另请注意,禁用 Server: 头并不能让服务器更安全。通过模糊来实现“安全”的想法是一种误解,会导致一种虚假的安全感。

另请参阅

top

SetHandler 指令

描述强制所有匹配文件由处理程序处理
语法SetHandler handler-name|none|expression
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心
兼容性expression 参数 2.4.19 及更高版本

当放置在 .htaccess 文件或 <Directory><Location> 部分中时,此指令强制所有匹配文件通过 处理程序 handler-name 进行解析。例如,如果您有一个目录希望完全解析为图像映射规则文件,而不管扩展名如何,您可以在该目录的 .htaccess 文件中放置以下内容

SetHandler imap-file

另一个示例:如果您希望服务器在调用 http://servername/status 的 URL 时显示状态报告,您可以在 httpd.conf 中放置以下内容

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

您还可以使用此指令为具有特定文件扩展名的文件配置特定处理程序。例如

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>

字符串值表达式可用于引用每个请求变量,包括对命名正则表达式的反向引用

<LocationMatch ^/app/(?<sub>[^/]+)/>
     SetHandler "proxy:unix:/var/run/app_%{env:MATCH_sub}.sock|fcgi://localhost:8080"
</LocationMatch>

您可以使用值 None 覆盖之前定义的 SetHandler 指令。

注意

由于 SetHandler 覆盖了默认处理程序,因此会抑制正常行为,例如将以斜杠 (/) 结尾的 URL 作为目录或索引文件进行处理。

另请参阅

top

SetInputFilter 指令

描述设置将处理客户端请求和 POST 输入的过滤器
语法SetInputFilter filter[;filter...]
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心

SetInputFilter 指令设置在服务器收到客户端请求和 POST 输入时将处理这些请求和输入的过滤器。这将添加到在其他地方定义的任何过滤器中,包括 AddInputFilter 指令。

如果指定了多个过滤器,则必须按它们处理内容的顺序用分号分隔这些过滤器。

另请参阅

top

SetOutputFilter 指令

描述设置将处理服务器响应的过滤器
语法SetOutputFilter filter[;filter...]
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态核心
模块核心

SetOutputFilter 指令设置在将服务器响应发送到客户端之前将处理这些响应的过滤器。这将添加到在其他地方定义的任何过滤器中,包括 AddOutputFilter 指令。

例如,以下配置将处理 /www/data/ 目录中的所有文件以进行服务器端包含。

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

如果指定了多个过滤器,则必须按它们处理内容的顺序用分号分隔这些过滤器。

另请参阅

top

StrictHostCheck 指令

描述控制服务器是否要求请求的主机名列在处理请求的虚拟主机中
语法StrictHostCheck ON|OFF
默认StrictHostCheck OFF
上下文服务器配置、虚拟主机
状态核心
模块核心
兼容性在 2.4.49 中添加

默认情况下,服务器将响应任何主机名的请求,包括发送到意外或未配置主机名的请求。虽然这很方便,但有时需要限制后端应用程序处理的主机名,因为它通常会生成自引用响应。

通过将 StrictHostCheck 设置为 ON,如果请求的主机名尚未在与传入连接的详细信息最匹配的虚拟主机中通过 ServerNameServerAlias 明确列出,则服务器将返回 HTTP 400 错误。

此指令还允许将请求的主机名与在打开的 VirtualHost 标记中指定的主机名进行匹配,这是一种相对模糊的配置机制,其作用类似于其他 ServerAlias 条目。

此指令在非默认虚拟主机中不起作用。从全局服务器配置或底层连接的 ip:port 继承的值确定有效值。

top

TimeOut 指令

描述服务器在请求失败之前等待某些事件的时间量
语法TimeOut seconds
默认TimeOut 60
上下文服务器配置、虚拟主机
状态核心
模块核心

TimeOut 指令定义 Apache httpd 在各种情况下等待 I/O 的时间长度

top

TraceEnable 指令

描述确定对 TRACE 请求的行为
语法TraceEnable [on|off|extended]
默认TraceEnable on
上下文服务器配置、虚拟主机
状态核心
模块核心

此指令会覆盖核心服务器和 mod_proxyTRACE 的行为。默认的 TraceEnable on 允许根据 RFC 2616 进行 TRACE 请求,这会禁止任何请求正文随附请求。TraceEnable off 会导致核心服务器和 mod_proxy 向客户端返回 405(方法不被允许)错误。

最后,仅出于测试和诊断目的,可以使用不兼容的 TraceEnable extended 指令允许请求正文。核心(作为源服务器)会将请求正文限制为 64Kb(如果使用 Transfer-Encoding: chunked,则加上 8Kb 的块头)。核心会将完整头和所有块头与响应正文一起反映出来。作为代理服务器,请求正文不受 64Kb 的限制。

注意

尽管有相反的说法,启用 TRACE 方法并不会在 Apache httpd 中暴露任何安全漏洞。TRACE 方法由 HTTP/1.1 规范定义,并且预计实现会支持它。

top

UNCList 指令

描述控制服务器可以访问哪些 UNC 主机名
语法UNCList hostname [hostname...]
默认unset
上下文服务器配置
状态核心
模块核心
兼容性在 2.4.60 中添加,仅适用于 Windows。

在请求处理过程中,对解析为 UNC 路径的文件系统路径的访问请求会失败,除非 UNC 路径中的主机名已由该指令指定。目的是限制对源自不受信任输入的路径的访问。

UNCList example.com other.example.com

安全性

在请求处理之外访问的 UNC 路径(例如在启动期间)不一定根据此指令配置的主机名进行检查。

指令排序

此指令应放在 httpd.conf 中使用的 UNC 路径之前。多次出现该指令会重置列表。

top

UnDefine 指令

描述取消定义变量的存在
语法UnDefine parameter-name
上下文服务器配置
状态核心
模块核心

撤消 Define 的效果或将 -D 参数传递给 httpd 的效果。

此指令可用于切换 <IfDefine> 部分的使用,而无需更改任何启动脚本中的 -D 参数。

变量名称不能包含冒号 “:” 字符,以避免与 RewriteMap 的语法冲突。

虚拟主机范围和缺陷

虽然此指令在虚拟主机上下文中受支持,但它所做的更改对任何后续配置指令都是可见的,超出了任何封闭的虚拟主机。

另请参阅

top

UseCanonicalName 指令

描述配置服务器如何确定自己的名称和端口
语法UseCanonicalName On|Off|DNS
默认UseCanonicalName Off
上下文服务器配置、虚拟主机、目录
状态核心
模块核心

在许多情况下,Apache httpd 必须构建一个自引用 URL -- 即一个引用回同一服务器的 URL。使用 UseCanonicalName On 时,Apache httpd 将使用 ServerName 指令中指定的主机名和端口来构建服务器的规范名称。此名称用于所有自引用 URL,以及 CGI 中 SERVER_NAMESERVER_PORT 的值。

使用 UseCanonicalName Off 时,Apache httpd 将使用客户端提供的(如果提供了)主机名和端口来形成自引用 URL(否则将使用规范名称,如上所述)。这些值与用于实现 基于名称的虚拟主机 的值相同,并且可供相同的客户端使用。CGI 变量 SERVER_NAMESERVER_PORT 也将根据客户端提供的值构建。

此功能可能在内联网服务器上有用,在该服务器上,用户使用短名称(如 www)连接到计算机。您会注意到,如果用户键入短名称和目录形式的 URL(如 http://www/splat),不带尾部斜杠,则 Apache httpd 会将他们重定向到 http://www.example.com/splat/。如果您启用了身份验证,则用户必须进行两次身份验证(一次针对 www,一次针对 www.example.com——有关更多信息,请参见有关此主题的常见问题解答)。但如果将 UseCanonicalName 设置为 Off,则 Apache httpd 会重定向到 http://www/splat/

还有第三个选项 UseCanonicalName DNS,此选项适用于基于 IP 的大规模虚拟主机,以支持不提供 Host: 标头的旧式客户端。使用此选项时,Apache httpd 会对客户端连接到的服务器 IP 地址进行反向 DNS 查找,以找出自引用 URL。

警告

如果 CGI 对 SERVER_NAME 的值做出假设,则此选项可能会破坏它们。客户端基本上可以自由地提供任何值作为主机名。但如果 CGI 仅使用 SERVER_NAME 来构造自引用 URL,则应该没问题。

另请参阅

top

UseCanonicalPhysicalPort 指令

描述配置服务器如何确定其自己的端口
语法UseCanonicalPhysicalPort On|Off
默认UseCanonicalPhysicalPort Off
上下文服务器配置、虚拟主机、目录
状态核心
模块核心

在许多情况下,Apache httpd 必须构造一个自引用 URL——即一个引用回同一服务器的 URL。当 UseCanonicalPhysicalPort On 时,Apache httpd 在为服务器构造规范端口以遵守 UseCanonicalName 指令时,会提供此请求使用的实际物理端口号作为潜在端口。当 UseCanonicalPhysicalPort Off 时,Apache httpd 永远不会使用实际物理端口号,而是依赖所有已配置的信息来构造有效的端口号。

注意

使用物理端口时的查找顺序如下

UseCanonicalName On
  1. Servername 中提供的端口
  2. 物理端口
  3. 默认端口
UseCanonicalName Off | DNS
  1. Host: 标头中解析的端口
  2. 物理端口
  3. Servername 中提供的端口
  4. 默认端口

对于 UseCanonicalPhysicalPort Off,物理端口已从顺序中移除。

另请参阅

top

<VirtualHost> 指令

描述包含仅适用于特定主机名或 IP 地址的指令
语法<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
上下文服务器配置
状态核心
模块核心

<VirtualHost></VirtualHost> 用于包含仅适用于特定虚拟主机的指令组。可以使用虚拟主机上下文中允许的任何指令。当服务器收到对特定虚拟主机上文档的请求时,它会使用 <VirtualHost> 部分中包含的配置指令。Addr 可以是以下任何一项,后面可以跟一个冒号和一个端口号(或 *)

<VirtualHost 10.1.2.3:80>
  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>

IPv6 地址必须用方括号指定,因为否则无法确定可选端口号。下面显示了一个 IPv6 示例

<VirtualHost [2001:db8::a00:20ff:fea7:ccea]:80>
  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 数据包。(如果机器没有多个网络接口,那么可以使用 ifconfig alias 命令来实现此目的——如果您的操作系统支持的话)。

注意

使用 <VirtualHost> 不会影响 Apache httpd 侦听的地址。您可能需要使用 Listen 确保 Apache httpd 侦听正确的地址。

应在每个 <VirtualHost> 块内指定 ServerName。如果它不存在,将继承“主”服务器配置中的 ServerName

收到请求时,服务器首先根据本地 IP 地址和端口组合将其映射到最佳匹配的 <VirtualHost>。非通配符具有更高的优先级。如果根本没有基于 IP 和端口的匹配,则使用“主”服务器配置。

如果多个虚拟主机包含最佳匹配的 IP 地址和端口,则服务器将从这些虚拟主机中根据请求的主机名选择最佳匹配。如果没有找到基于名称的匹配虚拟主机,则将使用与 IP 地址匹配的第一个列出的虚拟主机。因此,对于给定的 IP 地址和端口组合,第一个列出的虚拟主机是该 IP 和端口组合的默认虚拟主机。

安全性

请参阅 安全提示 文档,了解如果存储日志文件的目录可被除启动服务器的用户之外的任何人写入,您的安全为何可能受到损害的详细信息。

另请参阅

可用语言:  de  |  en  |  es  |  fr  |  ja  |  tr 

top

评论

注意
这不是问答部分。此处放置的评论应针对改进文档或服务器的建议,如果已实施或被认为无效/与主题无关,我们的版主可能会将其删除。有关如何管理 Apache HTTP 服务器的问题应直接发送到我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表