Apache 核心功能

Description:始终可用的核心 Apache HTTP Server 功能
Status:Core

AcceptFilter Directive

Description:为协议的侦听器套接字配置优化
Syntax:AcceptFilter protocol accept_filter
Context:server config
Status:Core
Module:core

该指令通过Protocol类型为侦听套接字启用特定于 os 的优化。基本前提是内核在接收到数据或缓冲整个 HTTP 请求之前,不向服务器进程发送套接字。当前仅支持FreeBSD 的接受过滤器,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选项不会 await 初始数据传输。

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

The data AcceptFilter (Windows)

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

在 Windows 上,当前版本的 httpd 默认为connect过滤器,如果指定了data,则回落到connect。鼓励早期版本的用户为其 AcceptFilter 添加connect的显式设置,如上所示。

See also

AcceptPathInfo Directive

Description:资源接受尾随路径名信息
Syntax:AcceptPathInfo On|Off|Default
Default:AcceptPathInfo Default
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core

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

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

AcceptPathInfo指令的三个可能的参数是:

  • Off

    • 仅当请求 Map 到存在的 Literals 路径时,该请求才会被接受。因此,在上面的示例中,在真实文件名之后带有尾随路径名信息的请求(例如/test/here.html/more)将返回 404 NOT FOUND 错误。
  • On

    • 如果前导路径组件 Map 到存在的文件,则将接受请求。如果/test/here.htmlMap 到有效文件,则上面的示例/test/here.html/more将被接受。
  • Default

    • 具有尾随路径名信息的请求的处理方式由负责该请求的handler确定。普通文件的核心处理程序默认为拒绝PATH_INFO请求。提供脚本(例如cgi-scriptisapi-handler)的处理程序通常默认情况下接受PATH_INFO

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

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

AccessFileName Directive

Description:分布式配置文件的名称
Syntax:AccessFileName filename [filename] ...
Default:AccessFileName .htaccess
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

AccessFileName .acl

在返回文档/usr/local/web/index.html之前,服务器将读取/.acl/usr/.acl/usr/local/.acl/usr/local/web/.acl作为指令,除非已使用以下命令禁用了它们:

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

See also

AddDefaultCharset Directive

Description:响应 Content Type 为text/plaintext/html时要添加的默认字符集参数
Syntax:AddDefaultCharset On|Off|charset
Default:AddDefaultCharset Off
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core

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

AddDefaultCharset utf-8

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

See also

AllowEncodedSlashes Directive

Description:确定是否允许通过 URL 中的编码路径分隔符
Syntax:AllowEncodedSlashes On|Off|NoDecode
Default:AllowEncodedSlashes Off
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:2.3.12 及更高版本中提供了 NoDecode 选项。

AllowEncodedSlashes指令允许在路径信息中使用包含编码的路径分隔符的 URL(对于/来说是%2F,在一致的系统上是\则另外是%5C)。

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

使用值On,将接受此类 URL,并且像所有其他编码字符一样对编码斜杠进行解码。

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

PATH_INFO结合使用时,转动AllowEncodedSlashes On最有用。

Note

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

See also

AllowOverride Directive

Description:.htaccess文件中允许的指令类型
Syntax:AllowOverride All|None|directive-type [directive-type] ...
Default:AllowOverride None (2.3.9 and later), AllowOverride All (2.3.8 and earlier)
Context:directory
Status:Core
Module:core

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

Only available in sections

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

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

当此伪指令设置为All时,.htaccess文件中将允许任何具有.htaccess Context的伪指令。

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

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

Security

非致命错误可能对.htaccess 用户有安全隐患。例如,如果 AllowOverride 不允许 AuthConfig,则旨在限制用户访问网站的用户配置将被禁用。

  • Options[= Option,...]

    • 允许使用控制特定目录功能(OptionsXBitHack)的指令。可以给一个等号,后跟一个逗号分隔的列表,不带空格,表示可以使用Options命令设置的选项。

Implicit disabling of Options

即使可以使用此伪指令限制.htaccess 文件中可能使用的选项列表,但只要允许任何Options伪指令,就可以使用非相对语法禁用其他任何继承的选项。换句话说,该机制不能强制某个特定选项保留* set *,而允许设置其他任何选项。

AllowOverride Options=Indexes,MultiViews

Example:

AllowOverride AuthConfig Indexes

在上面的示例中,不在组AuthConfigIndexes中的所有指令均导致内部服务器错误。

Note

出于安全和性能方面的考虑,请勿在<Directory "/">块中将AllowOverride设置为None以外的其他值。而是查找(或创建)<Directory>块,该块指向您实际计划放置.htaccess文件的目录。

See also

AllowOverrideList Directive

Description:.htaccess文件中允许的个别指令
Syntax:AllowOverrideList None|directive [directive-type] ...
Default:AllowOverrideList None
Context:directory
Status:Core
Module:core

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

Only available in sections

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

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

Example:

AllowOverride None
AllowOverrideList Redirect RedirectMatch

在上面的示例中,仅允许使用RedirectRedirectMatch指令。所有其他情况都将导致内部服务器错误。

Example:

AllowOverride AuthConfig
AllowOverrideList CookieTracking CookieName

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

See also

CGIMapExtension Directive

Description:为 CGI 脚本定位解释器的技术
Syntax:CGIMapExtension cgi-path .extension
Context:directory, .htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:NetWare only

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

CGIPassAuth Directive

Description:启用将 HTTP 授权 Headers 作为 CGI 变量传递给脚本
Syntax:CGIPassAuth On|Off
Default:CGIPassAuth Off
Context:directory, .htaccess
Override:AuthConfig
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.4.13 和更高版本中可用

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

可以使用此伪指令代替以前版本的 Apache HTTP Server 中可用的编译时设置SECURITY_HOLE_PASS_AUTHORIZATION

任何使用ap_add_common_vars()的模块(例如mod_cgimod_cgidmod_proxy_fcgimod_proxy_scgi等等)都遵守该设置。值得注意的是,它会影响通常无法处理请求但仍使用此 API 的模块;例如mod_includemod_ext_filter。不使用ap_add_common_vars()的第三方模块也可以选择遵循此设置。

CGIVar Directive

Description:控制如何设置某些 CGI 变量
Syntax:CGIVar variable rule
Context:directory, .htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.4.21 和更高版本中可用

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

REQUEST_URI 规则:

  • original-uri(默认)

    • 该值取自原始请求行,并且不会反映内部重定向或更改请求资源的子请求。
  • current-uri

    • 该值反映当前正在处理的资源,由于内部重定向或子请求,该资源可能与来自 Client 端的原始请求不同。

ContentDigest Directive

Description:启用Content-MD5 HTTP Response Headers 的生成
Syntax:ContentDigest On|Off
Default:ContentDigest Off
Context:服务器配置,虚拟主机,目录,.htaccess
Override:Options
Status:Core
Module:core

此伪指令可生成分别在 RFC1864 和 RFC2616 中定义的Content-MD5Headers。

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

Content-MD5Headers 提供了实体主体的端到端消息完整性检查(MIC)。代理或 Client 端可以检查此 Headers,以检测对运输中的实体的意外修改。Headers 示例:

Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==

请注意,这可能会导致服务器性能问题,因为消息摘要是针对每个请求进行计算的(不缓存值)。

仅针对core提供的文档发送Content-MD5,而不会发送任何模块的文档。例如,SSI 文档,CGI 脚本的输出以及字节范围响应都没有此 Headers。

DefaultRuntimeDir Directive

Description:服务器运行时文件的基本目录
Syntax:DefaultRuntimeDir directory-path
Default:DefaultRuntimeDir DEFAULT_REL_RUNTIMEDIR (logs/)
Context:server config
Status:Core
Module:core
Compatibility:在 Apache 2.4.2 和更高版本中可用

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

Example

DefaultRuntimeDir scratch/

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

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

See also

  • 安全提示获取有关如何在ServerRoot上正确设置权限的信息

DefaultType Directive

Description:如果该值不是none,则此指令除了发出警告外没有其他作用。在以前的版本中,DefaultType 将指定默认媒体类型以分配给响应内容,而找不到其他媒体类型配置。
Syntax:DefaultType media-type|none
Default:DefaultType none
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:参数none在 Apache httpd 2.2.7 和更高版本中可用。对于 2.3.x 及更高版本,所有其他选项均被禁用。

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

DefaultType None

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

使用 mime.types 配置文件和AddType通过文件 extensions 配置媒体类型分配,或使用ForceType指令为特定资源配置媒体类型。否则,服务器将发送不包含 Content-Type Headers 字段的响应,并且收件人可能会尝试猜测媒体类型。

Define Directive

Description:定义一个变量
Syntax:Define parameter-name [parameter-value]
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core

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

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

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

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

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

Virtual Host scope and pitfalls

尽管虚拟主机上下文中支持此指令,但其所作的更改对于任何后续的配置指令(除了任何封闭的虚拟主机)都是可见的。

See also


Directive

Description:包含一组仅适用于命名文件系统目录,子目录及其内容的指令。
Syntax:<Directory directory-path> ... </Directory>
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

如果需要,可以引用目录路径,但是,如果路径包含空格,则必须引用目录路径。这是因为否则空格将指示参数的结尾。

Note

注意目录路径参数:它们必须从字面上匹配 Apache httpd 用于访问文件的文件系统路径。应用于特定<Directory>的指令将不适用于通过不同路径(例如,通过不同符号链接)从同一目录访问的文件。

Regular expressions也可以使用,但要加上~字符。例如:

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

</Directory>

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

如果多个(非正则表达式)<Directory>节与包含文档的目录(或其父级之一)匹配,则将以最短匹配的 Sequences 应用这些指令,并插入.htaccess文件中的指令。例如,

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

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

访问文档/home/web/dir/doc.html的步骤是:

  • 应用指令AllowOverride None(禁用.htaccess个文件)。

  • 应用指令AllowOverride FileInfo(对于目录/home)。

  • 按此 Sequences 在/home/.htaccess/home/web/.htaccess/home/web/dir/.htaccess中应用任何FileInfo指令。

在应用了所有正常节之后,才考虑使用正则表达式。然后,按照它们在配置文件中出现的 Sequences 测试所有正则表达式。例如,

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

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

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

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

,然后为您访问的目录覆盖此内容.有关更多详细信息,请参见Security Tips页.

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

See also


Directive

Description:包含适用于与正则表达式匹配的文件系统目录的内容的指令。
Syntax:<DirectoryMatch regex> ... </DirectoryMatch>
Context:服务器配置,虚拟主机
Status:Core
Module:core

<DirectoryMatch></DirectoryMatch>用于封装一组指令,这些指令仅适用于命名目录(及其中的文件),与<Directory>相同。但是,它以regular expression作为参数。例如:

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

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

Compatibility

在 2.3.9 之前的版本中,此伪指令隐式应用于子目录(如<Directory>),并且与行符号($)的末尾不匹配。在 2.3.9 及更高版本中,仅与表达式匹配的目录受附带的指令影响。

Trailing Slash

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

从 2.4.8 开始,将捕获命名的组和反向引用,并将其以大写的前缀“ MATCH_”的相应名称写入环境。这允许从expressionsmod_rewrite之类的模块中引用路径的元素。为了防止混淆,已编号(未命名)的反向引用将被忽略。请改用命名组。

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

See also

DocumentRoot Directive

Description:构成从网络可见的主文档树的目录
Syntax:DocumentRoot directory-path
Default:DocumentRoot "/usr/local/apache/htdocs"
Context:服务器配置,虚拟主机
Status:Core
Module:core

该指令设置httpd将从中提供文件的目录。除非与Alias之类的指令匹配,否则服务器会将从请求的 URL 到文档根目录的路径附加到该文档的路径中。例:

DocumentRoot "/usr/web"

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

DocumentRoot应指定为不带斜杠。

See also


Directive

Description:包含仅在运行时请求不满足上一个<If><ElseIf>部分的条件时才适用的指令
Syntax:<Else> ... </Else>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:嵌套条件在 2.4.26 及更高版本中进行评估

且仅当未应用同一作用域中的最新<If><ElseIf>部分时,<Else>才会应用封闭的指令。例如:

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

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

See also


Directive

Description:包含仅在运行时请求满足条件而前一个<If><ElseIf>部分的条件不满足时才适用的指令
Syntax:<ElseIf expression> ... </ElseIf>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:嵌套条件在 2.4.26 及更高版本中进行评估

且仅当给定条件都为真且未应用同一作用域中的最新<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>将匹配。

See also

EnableMMAP Directive

Description:在传送过程中使用内存 Map 来读取文件
Syntax:EnableMMAP On|Off
Default:EnableMMAP On
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core

该指令控制httpd在传递过程中需要读取文件内容时是否可以使用内存 Map。默认情况下,当处理请求需要访问文件中的数据时(例如,当使用mod_include传递服务器解析的文件时),如果 os 支持,Apache httpd 内存将 Map 该文件。

这种内存 Map 有时会提高性能。但是在某些环境中,最好禁用内存 Map 以防止操作问题:

  • 在某些 multiprocessing 器系统上,内存 Map 会降低httpd的性能。

  • httpd具有内存 Map 时删除或截断文件可能会导致httpd崩溃,并出现分段错误。

对于易受这些问题影响的服务器配置,应通过指定以下内容来禁用已传递文件的内存 Map:

EnableMMAP Off

对于 NFS 挂载的文件,可以通过指定以下内容来明确禁用有问题的文件的此功能:

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

EnableSendfile Directive

Description:使用内核 sendfile 支持将文件传送到 Client 端
Syntax:EnableSendfile On|Off
Default:EnableSendfile Off
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:在版本 2.3.9 中默认更改为“关闭”。

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

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

  • 某些平台可能破坏了构建系统无法检测到的 sendfile 支持,特别是如果二进制文件是在另一个盒子上构建的,并且转移到了具有 sendfile 支持被破坏的机器上的话。

  • 在 Linux 上,使用 IPv6 时,使用 sendfile 会触发某些网卡上的 TCP 校验和卸载错误。

  • 在 Linux on Itanium 上,sendfile可能无法处理 2GB 以上的文件。

  • 使用网络安装的DocumentRoot(例如 NFS,SMB,CIFS,FUSE),内核可能无法通过其自己的缓存为网络文件提供服务。

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

EnableSendfile On

对于网络安装的文件,可以通过指定以下内容来明确禁用有问题的文件的此功能:

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

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

Error Directive

Description:使用自定义错误消息中止配置解析
Syntax:Error message
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Core
Module:core
Compatibility: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>

ErrorDocument Directive

Description:发生错误时服务器将返回给 Client 端的内容
Syntax:ErrorDocument error-code document
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core

如果出现问题或错误,则可以将 Apache httpd 配置为执行以下四种操作之一,

  • 输出简单的硬编码错误消息

  • 输出定制的消息

  • 内部重定向到本地 URL 路径以处理问题/错误

  • 重定向到外部 URL 以处理问题/错误

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

从 2.4.13 开始,可以在指令内部使用expression syntax来生成动态字符串和 URL。

URL 可以以本地网络路径的斜线(/)开头(相对于DocumentRoot),也可以是 Client 端可以解析的完整 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将恢复 Apache httpd 的简单硬编码消息,以进行配置,否则配置将继承现有的ErrorDocument

ErrorDocument 404 /cgi-bin/bad_urls.pl

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

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

默认情况下,Microsoft Internet Explorer(MSIE)将忽略服务器生成的错误消息,如果它们“太小”,而替换为它自己的“友好”错误消息。大小阈值因错误的类型而异,但是通常,如果使错误文档大于 512 字节,则 MSIE 将显示服务器生成的错误而不是将其掩盖。 Microsoft 知识库文章Q294807中提供了更多信息。

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

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

See also

ErrorLog Directive

Description:服务器将记录错误的位置
Syntax:ErrorLog file-path|syslog[:[facility][:tag]]
Default:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows and OS/2)
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

ErrorLog "/var/log/httpd/error_log"

如果文件路径以竖线字符“ |”开头,则假定它是生成以处理错误日志的命令。

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

有关更多信息,请参见piped logs上的 Comments。

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

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

其他模块可以提供自己的 ErrorLog 提供程序。语法类似于上面的syslog示例。

安全性:有关启动日志的用户以外的任何人都可写存储日志文件的目录的原因,为什么会损害安全性的详细信息,请参见security tips文档。

Note

在非 Unix 平台上 Importing 文件路径时,即使平台可能允许使用反斜杠,也应注意确保仅使用正斜杠。通常,在整个配置文件中始终使用正斜杠是一个好主意。

See also

ErrorLogFormat Directive

Description:错误日志条目的格式规范
Syntax:ErrorLogFormat [connection|request] format
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

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

connectionrequest指定为第一个参数允许指定其他格式,从而分别在记录特定连接或请求的第一条消息时记录其他信息。每个连接/请求仅记录一次此附加信息。如果在不引起任何日志消息的情况下处理连接或请求,则也不会记录其他信息。

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

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

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

例如,如果将修饰符添加到%{Referer}i令牌(记录Referer请求 Headers),将发生以下情况。

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

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

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

日志 ID 格式%L为连接或请求生成唯一的 ID。这可用于关联哪些日志行属于同一连接或请求,哪个请求发生在哪个连接上。 mod_log_config中还提供了%L格式的字符串,以允许将访问日志条目与错误日志行相关联。如果加载了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] File does not exist: /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] local\ %a remote\ %A"

See also

ExtendedStatus Directive

Description:跟踪每个请求的扩展状态信息
Syntax:ExtendedStatus On|Off
Default:ExtendedStatus Off[*]
Context:server config
Status:Core
Module:core

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

此设置适用于整个服务器,并且不能在逐个虚拟主机的基础上启用或禁用。扩展状态信息的收集会降低服务器的速度。另请注意,在正常重启期间无法更改此设置。

Note

请注意,加载mod_status会将默认行为更改为 ExtendedStatus On,而其他第三方模块可能会执行相同的操作。这样的模块依赖于收集有关所有 Worker 状态的详细信息。从版本 2.3.6 开始,默认值已由mod_status更改。以前的默认值始终为“关”。

FileETag Directive

Description:用于为静态文件创建 ETag HTTP 响应 Headers 的文件属性
Syntax:FileETag component ...
Default:FileETag MTime Size
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:在 2.3.14 及更早版本中,默认值是“ INode MTime Size”。

FileETag伪指令配置文件属性,当文档基于静态文件时,该文件属性用于创建ETag(实体标签)响应头字段。 (ETag值在高速缓存 Management 中用于节省网络带宽.)FileETag指令允许您选择应使用其中的哪一个(如果有)。公认的关键字是:

  • INode

    • 文件的索引节点编号将包含在计算中
  • MTime

    • 上次修改文件的日期和时间将包括在内
  • Size

    • 文件中的字节数将包括在内
  • All

将使用所有可用字段。这等效于:

FileETag INode MTime Size
  • None

  • 如果文档是基于文件的,则响应中将不包含ETag字段

INodeMTimeSize关键字可以带有+-前缀,这允许对从更广范围继承的默认设置进行更改。如果出现没有这样的前缀的任何关键字,则会立即完全取消继承的设置。

如果目录的配置包含FileETag INode MTime Size,而子目录的包含FileETag -INode,则该子目录的设置(将由不覆盖它的所有子子目录继承)将等同于FileETag MTime Size

Warning

不要更改已启用 WebDAV 并使用mod_dav_fs作为存储提供程序的目录或位置的默认设置。 mod_dav_fs使用MTime Size作为固定格式,用于对条件请求进行ETag比较。如果通过FileETag更改ETag格式,则这些条件请求将中断。

Server Side Includes

对于由mod_include解析的响应,不会生成 ETag,因为响应实体可以更改,而无需更改具有嵌入式 SSI 指令的 INode,MTime 或静态文件的大小。


Directive

Description:包含适用于匹配文件名的指令
Syntax:<Files filename> ... </Files>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

<Files>指令通过文件名限制了随附指令的范围。它与<Directory><Location>指令可比。它应与</Files>指令匹配。本节中给出的指令将应用于具有与指定文件名匹配的基本名(文件名的最后一个组成部分)的任何对象。 <Files>节按照在配置文件中出现的 Sequences 进行处理,在读取<Directory>节和.htaccess文件之后,但在<Location>节之前。请注意,可以将<Files>嵌套在<Directory>部分中,以限制它们应用于文件系统的一部分。

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>

Regular expressions也可以使用,但要加上~字符。例如:

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

可以匹配最常见的 Internet 图形格式。但是,首选<FilesMatch>

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

See also


Directive

Description:包含适用于正则表达式匹配文件名的指令
Syntax:<FilesMatch regex> ... </FilesMatch>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

<FilesMatch>指令与文件名<Files>一样,按文件名限制了封闭指令的范围。但是,它接受regular expression。例如:

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

可以匹配最常见的 Internet 图形格式。

Note

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

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

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

See also

ForceType Directive

Description:强制所有匹配的文件以 HTTP Content-Type Headers 字段中的指定媒体类型提供
Syntax:ForceType media-type|None
Context:directory, .htaccess
Override:FileInfo
Status:Core
Module:core

当放置在.htaccess文件或<Directory><Location><Files>节中时,此伪指令将强制所有匹配的文件使用 media-type 给出的 Content Type 标识进行服务。例如,如果您的目录中充满了 GIF 文件,但不想将它们全部标记为.gif,则可能要使用:

ForceType image/gif

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

您还可以使用None的值来覆盖更通用的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。对于静态文件以外的资源,其中响应的生成器通常指定 Content-Type,此指令无效。

Note

当诸如SetHandlerAddHandler之类的显式指令不适用于当前请求时,通常将这些指令设置的内部处理程序名称设置为与该指令指定的 Content Type 匹配。这是一种历史行为,某些第三方模块(例如 mod_php)可能会使用“魔术”Content Type,这些 Content Type 仅用于指示该模块对匹配请求负责。应该通过使用SetHandlerAddHandler避免依赖于此类“魔术”类型的配置。

GprofDir Directive

Description:要写入 gmon.out 分析数据的目录。
Syntax:GprofDir /tmp/gprof/|/tmp/gprof/%
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

该指令当前仅适用于prefork MPM。

HostnameLookups Directive

Description:在 Client 端 IP 地址上启用 DNS 查找
Syntax:HostnameLookups On|Off|Double
Default:HostnameLookups Off
Context:服务器配置,虚拟主机,目录
Status:Core
Module: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子目录中的 Utillogresolve可用于从已记录的 IP 地址脱机查找主机名。

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

HttpProtocolOptions Directive

Description:修改 HTTP 请求消息的限制
Syntax:HttpProtocolOptions [Strict|Unsafe] [RegisteredMethods|LenientMethods] [Allow0.9|Require1.0]
Default:HttpProtocolOptions Strict LenientMethods Allow0.9
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:2 .2.32 或 2.4.24 及更高版本

该指令更改了应用于 HTTP 请求行(RFC 7230§3.1.1)和 HTTP 请求 Headers 字段(RFC 7230§3.2)的规则,现在默认情况下或使用Strict选项将其应用。由于存在遗留模块,必须弃用的应用程序或自定义用户代理已添加Unsafe选项以还原为遗留行为。

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

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

  • Strict|Unsafe

    • 在引入该指令之前,Apache HTTP Server 请求消息解析器可以容忍多种不符合该协议的 Importing 形式。 RFC 7230§9.4 请求拆分§9.5 应对走私仅指出接受不合格请求消息的两种潜在风险,而RFC 7230§3.5“消息解析的健壮性”则确定接受模糊的空白和请求消息格式化的风险。从引入该指令开始,该规范的所有语法规则都在默认的Strict操作模式下强制执行,并且第 3.5 节建议的严格空格强制执行且不能放宽。

Security risks of Unsafe

强烈警告用户不要切换Unsafe操作模式,尤其是在面向外部且可公开访问的服务器部署上。如果需要接口以进行故障监视或在 Intranet 上运行的其他自定义服务使用者,则用户应仅在配置为为其内部专用网络提供服务的特定虚拟主机上切换“不安全”选项。

导致使用严格模式的 HTTP 400 的请求示例

# Missing CRLF GET / HTTP/1.0\n\n

Command line tools and CRLF

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

DumpIOInput指令可在查看 HTTP 请求以识别诸如 CRLF 缺失之类的问题时提供帮助。

  • RegisteredMethods|LenientMethods

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

Forward Proxy compatibility

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

使用 LenientMethods 模式导致 HTTP 501 的请求示例

# Unknown HTTP method WOW / HTTP/1.0\r\n\r\n # Lowercase HTTP method 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中提供了附加 Comments。 Require1.0选项允许用户删除对默认Allow0.9选项行为的支持。

导致使用 Require1.0 模式的 HTTP 400 的请求示例

# Unsupported HTTP version GET /\r\n\r\n

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


Directive

Description:包含仅在运行时请求满足条件时才适用的指令
Syntax:<If expression> ... </If>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:嵌套条件在 2.4.26 及更高版本中进行评估

<If>指令在运行时对表达式进行求值,并且仅当表达式求值为 true 时,才会应用附带的指令。例如:

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

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

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

类壳模式匹配和许多其他操作。这些操作可以在请求 Headers(req),环境变量(env)和大量其他属性上完成。完整的文档位于Apache HTTP Server 中的表达式中。

在配置部分中只能使用支持directory context的指令。

Warning

某些变量(例如CONTENT_TYPE和其他响应 Headers)是在已经评估条件之后设置的,因此将无法在此伪指令中使用。

See also


Directive

Description:包含仅在启动时测试为真时才处理的指令
Syntax:<IfDefine [!]parameter-name> ... </IfDefine>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

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

<IfDefine>节指令中的测试可以是以下两种形式之一:

  • parameter-name

  • ! parameter-name

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

parameter-name 参数是在启动服务器时或通过_指令在_命令行上通过-Dparameter给出的定义。

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


Directive

Description:包含根据是否存在特定指令而处理的指令
Syntax:<IfDirective [!]directive-name> ... </IfDirective>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:在 2.4.34 及更高版本中可用。

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

<IfDirective>部分中的测试可以是以下两种形式之一:

  • directive-name

  • !directive-name

在前一种情况下,只有在处理时有给定名称的指令可用时,才处理开始标记和结束标记之间的指令。第二种格式可逆转测试,并且仅在指令名称不可用时才处理指令。

Note

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

See also


Directive

Description:包含仅在文件启动时才会处理的指令
Syntax:<IfFile [!]filename> ... </IfFile>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:在 2.4.34 及更高版本中可用。

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

<IfFile>部分指令中的文件名可以采用与<IfDefine>部分中的测试变量相同的形式,即,如果将!字符直接放在文件名之前,则可以否定测试。

如果提供了相对文件名,则检查为ServerRoot相对文件名。如果此指令出现在ServerRoot之前,则将相对于已编译的服务器根目录或通过-d参数在命令行中传递的服务器根目录检查路径。


Directive

Description:包含根据特定模块是否存在而进行处理的指令
Syntax:<IfModule [!]module-file|module-identifier> ... </IfModule>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:模块标识符在 2.1 版和更高版本中可用。

<IfModule test>...</IfModule>部分用于标记以特定模块的存在为条件的指令。仅在测试为真时,才处理<IfModule>部分中的指令。如果 test 为假,则忽略开始标记和结束标记之间的所有内容。

<IfModule>节指令中的测试可以是以下两种形式之一:

  • module

  • !module

在前一种情况下,仅当 Apache httpd 中包含名为 module 的模块时,才处理开始标记和结束标记之间的指令-可以使用LoadModule进行编译或动态加载。第二种格式可以逆转测试,并且仅在不包括模块的情况下才处理指令。

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

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

Note

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


Directive

Description:包含根据是否存在特定节指令而进行处理的指令
Syntax:<IfSection [!]section-name> ... </IfSection>
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core
Compatibility:在 2.4.34 及更高版本中可用。

<IfSection test>...</IfSection>节用于标记以特定节指令为条件的指令。节指令是任何指令,例如<VirtualHost>,它包围其他指令,并且指令名称前带有“ <”。

仅当测试为真时,才会处理<IfSection>部分中的指令。如果 test 为假,则忽略开始标记和结束标记之间的所有内容。

必须指定段名,且开头不能带有“ <”或“>”。 <IfSection>部分中的测试可以是以下两种形式之一:

  • section-name

  • !section-name

在前一种情况下,只有在处理时可以使用给定名称的段指令时,才处理开始标记和结束标记之间的指令。第二种格式可以逆转测试,并且仅当 section-name 不是可用的 section 指令时才处理指令。

For example:

<IfSection VirtualHost>
   ...
</IfSection>

Note

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

See also

Include Directive

Description:包括服务器配置文件中的其他配置文件
Syntax:Include file-path|directory-path|wildcard
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core
Compatibility:目录通配符匹配在 2.3.6 和更高版本中可用

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

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

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

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

Examples:

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

See also

IncludeOptional Directive

Description:包括服务器配置文件中的其他配置文件
Syntax:IncludeOptional file-path|directory-path|wildcard
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core
Compatibility:在 2.3.6 及更高版本中可用。没有通配符的不存在文件路径在 2.4.30 之后不会导致 SyntaxError

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

See also

KeepAlive Directive

Description:启用 HTTP 持久连接
Syntax:KeepAlive On|Off
Default:KeepAlive On
Context:服务器配置,虚拟主机
Status:Core
Module:core

HTTP/1.0 的 Keep-Alive 扩展和 HTTP/1.1 的持久连接功能提供了长期存在的 HTTP 会话,该会话允许通过同一 TCP 连接发送多个请求。在某些情况下,对于包含许多图像的 HTML 文档,这已导致延迟时间提高了近 50%。要启用“保持活动”连接,请设置KeepAlive On

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

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

See also

KeepAliveTimeout Directive

Description:服务器将在持久连接上 await 后续请求的时间
Syntax:KeepAliveTimeout num[ms]
Default:KeepAliveTimeout 5
Context:服务器配置,虚拟主机
Status:Core
Module:core

Apache httpd 在关闭连接之前将 await 后续请求的秒数。通过添加 ms 的后缀,还可以以毫秒为单位设置超时。收到请求后,将使用Timeout指令指定的超时值。

KeepAliveTimeout设置为较高的值可能会导致负载较重的服务器出现性能问题。超时时间越高,await 与空闲 Client 端的连接时将占用更多服务器进程。

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


Directive

Description:将封闭的访问控制限制为仅某些 HTTP 方法
Syntax:<Limit method [method] ... > ... </Limit>
Context:directory, .htaccess
Override:AuthConfig, Limit
Status:Core
Module:core

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

<Limit>指令的目的是将访问控制的影响限制为指定的 HTTP 方法。对于所有其他方法,<Limit>括号内的访问限制 无效 。以下示例仅将访问控制应用于方法POSTPUTDELETE,而所有其他方法均不受保护:

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

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

Warning

当限制访问时,应始终优先使用<LimitExcept>节而不是<Limit>节,因为<LimitExcept>节提供了针对任意方法的保护。

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

Warning

当将<Limit><LimitExcept>指令与Require指令一起使用时,请注意,成功的第一个Require会授权该请求,而不考虑其他Require指令的存在。

例如,给定以下配置,将授权所有用户执行POST个请求,并且在所有情况下都将忽略Require group editors指令:

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


Directive

Description:将访问控制限制为除命名方法外的所有 HTTP 方法
Syntax:<LimitExcept method [method] ... > ... </LimitExcept>
Context:directory, .htaccess
Override:AuthConfig, Limit
Status:Core
Module:core

<LimitExcept></LimitExcept>用于封装一组访问控制指令,这些指令随后将应用于参数中列出的所有 HTTP 访问方法 not ;即与<Limit>部分相反,可用于控制标准方法和非标准/无法识别的方法。有关更多详细信息,请参见<Limit>的文档。

For example:

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

LimitInternalRecursion Directive

Description:确定内部重定向和嵌套子请求的最大数量
Syntax:LimitInternalRecursion number [number]
Default:LimitInternalRecursion 10
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

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

该指令存储两个不同的限制,这些限制将根据每个请求进行评估。第一个数字是可能互相跟随的内部重定向的最大数量。第二个数字确定子请求的嵌套深度。如果仅指定一个数字,则会将其分配给两个限制。

LimitInternalRecursion 5

LimitRequestBody Directive

Description:限制从 Client 端发送的 HTTP 请求正文的总大小
Syntax:LimitRequestBody bytes
Default:LimitRequestBody 0
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

此伪指令指定请求正文中允许的字节数,范围从 0(无限制)到 2147483647(2GB)。有关代理请求的有限适用性,请参见下面的 Comments。

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

此伪指令使服务器 Management 员可以更好地控制异常的 Client 端请求行为,这对于避免某种形式的拒绝服务攻击可能很有用。

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

LimitRequestBody 102400

Note

有关代理请求如何解释此伪指令的完整说明,请参见mod_proxy文档。

LimitRequestFields Directive

Description:限制将从 Client 端接受的 HTTP 请求 Headers 字段的数量
Syntax:LimitRequestFields number
Default:LimitRequestFields 100
Context:服务器配置,虚拟主机
Status:Core
Module:core

Number 是一个从 0(表示无限制)到 32767 的整数。默认值由编译时常数DEFAULT_LIMIT_REQUEST_FIELDS(分布时为 100)定义。

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

此伪指令使服务器 Management 员可以更好地控制异常的 Client 端请求行为,这对于避免某种形式的拒绝服务攻击可能很有用。如果普通 Client 端看到来自服务器的错误响应(指示在请求中发送了太多字段),则应增加该值。

For example:

LimitRequestFields 50

Warning

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

LimitRequestFieldSize Directive

Description:限制 Client 端允许的 HTTP 请求 Headers 的大小
Syntax:LimitRequestFieldSize bytes
Default:LimitRequestFieldSize 8190
Context:服务器配置,虚拟主机
Status:Core
Module:core

该指令指定 HTTP 请求 Headers 中允许的字节数。

LimitRequestFieldSize指令允许服务器 Management 员设置 HTTP 请求 Headers 字段的允许大小限制。服务器需要此值足够大以容纳正常 Client 端请求中的任何一个 Headers 字段。在不同的 Client 端实现中,正常请求 Headers 字段的大小将有很大的不同,这通常取决于用户将其浏览器配置为支持详细内容协商的程度。 SPNEGO 身份验证 Headers 最多可以为 12392 个字节。

此伪指令使服务器 Management 员可以更好地控制异常的 Client 端请求行为,这对于避免某种形式的拒绝服务攻击可能很有用。

For example:

LimitRequestFieldSize 4094

Note

在正常情况下,该值不应更改为默认值。

Warning

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

LimitRequestLine Directive

Description:限制将从 Client 端接受的 HTTP 请求行的大小
Syntax:LimitRequestLine bytes
Default:LimitRequestLine 8190
Context:服务器配置,虚拟主机
Status:Core
Module:core

此伪指令设置 HTTP 请求行上允许的字节数。

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

此伪指令使服务器 Management 员可以更好地控制异常的 Client 端请求行为,这对于避免某种形式的拒绝服务攻击可能很有用。

For example:

LimitRequestLine 4094

Note

在正常情况下,该值不应更改为默认值。

Warning

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

LimitXMLRequestBody Directive

Description:限制基于 XML 的请求正文的大小
Syntax:LimitXMLRequestBody bytes
Default:LimitXMLRequestBody 1000000
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

限制(以字节为单位)基于 XML 的请求正文的最大大小。值0将禁用所有检查。

Example:

LimitXMLRequestBody 0


Directive

Description:仅将随附的指令应用于匹配的 URL
Syntax:<Location URL-path|URL> ... </Location>
Context:服务器配置,虚拟主机
Status:Core
Module:core

<Location>指令通过 URL 限制了随附指令的范围。它类似于<Directory>指令,并开始一个子节,该子节以</Location>指令终止。 <Location>节按照在配置文件中出现的 Sequences,在读取<Directory>节和.htaccess文件之后以及在<Files>节之后的 Sequences 进行处理。

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

如果 URL 的路径部分符合以下任一条件,则将随附的指令应用于请求:

  • 指定的位置与 URL 的路径部分完全匹配。

  • 以反斜杠结尾的指定位置是 URL 路径部分的前缀(视为上下文根)。

  • 指定的位置加上结尾的斜杠,是 URL 路径部分的前缀(也视为上下文根)。

在下面的示例中,在不使用尾部斜杠的情况下,对/ private1,/ private1 /和/private1/file.txt 的请求将应用随附的指令,而/ private1other 则不使用。

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

在下面的示例中,使用尾部斜杠,对/ private2 /和/private2/file.txt 的请求将应用随附的指令,而/ private2 和/ private2other 则不包含。

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

When to use

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

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

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

Regular expressions也可以使用,但要加上~字符。例如:

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

Note about/(slash)

斜杠具有特殊的含义,具体取决于它在 URL 中出现的位置。人们可能会习惯于文件系统中的行为,在文件系统中,多个相邻的斜杠经常折叠为一个斜杠(,即/home///foo/home/foo相同)。在 URL 空间中,这不一定是正确的。 <LocationMatch>指令和<Location>的正则表达式版本要求您明确指定多个斜杠(如果您打算这样做)。

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

See also


Directive

Description:仅将随附的指令应用于正则表达式匹配的 URL
Syntax:<LocationMatch regex> ... </LocationMatch>
Context:服务器配置,虚拟主机
Status:Core
Module:core

<LocationMatch>指令以与<Location>相同的方式通过 URL 限制了封闭指令的范围。但是,它以regular expression作为参数而不是简单的字符串。例如:

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

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

starts with

如果意图是 URL /extra/data而不是仅包含** /extra/data,则在正则表达式前添加^来要求它。

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

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

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

Note about/(slash)

斜杠具有特殊的含义,具体取决于它在 URL 中出现的位置。人们可能会习惯于文件系统中的行为,在文件系统中,多个相邻的斜杠经常折叠为一个斜杠(,即/home///foo/home/foo相同)。在 URL 空间中,这不一定是正确的。 <LocationMatch>指令和<Location>的正则表达式版本要求您明确指定多个斜杠(如果您打算这样做)。

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

See also

LogLevel Directive

Description:控制 ErrorLog 的详细程度
Syntax:LogLevel [module:]level [module:level] ...
Default:LogLevel warn
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core
Compatibility:Apache HTTP Server 2.3.6 和更高版本中提供了按模块和按目录的配置

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

LevelDescriptionExample
emerg紧急情况-系统无法使用。“孩子无法打开锁定文件。正在退出”
alert必须立即采取行动。“ getpwuid:无法从 uid 确定用户名”
critCritical Conditions.“套接字:无法获取套接字,正在退出子进程”
errorError conditions.“脚本头过早结束”
warnWarning conditions.“子进程 1234 没有退出,发送了另一个 SIGHUP”
notice正常但状况显着。“ httpd:捕获了 SIGBUS,试图将内核转储到...”
infoInformational.“服务器似乎很忙,(您可能需要增加 StartServers 或 Min/MaxSpareServers)...”
debugDebug-level messages“正在打开配置文件...”
trace1Trace messages“代理:FTP:控制连接完成”
trace2Trace messages“代理:CONNECT:将 CONNECT 请求发送到远程代理”
trace3Trace messages“ openssl:握手:开始”
trace4Trace messages“从缓冲的 SSL 旅读取,模式 0,17 个字节”
trace5Trace messages“Map 查找失败:map = rewritemap key = keyname”
trace6Trace messages“缓存查找失败,强制进行新的 Map 查找”
trace7跟踪消息,转储大量数据0000:02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15
trace8跟踪消息,转储大量数据0000:02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15

当指定了特定级别时,还将报告来自所有其他更高级别的消息。 例如,当指定LogLevel info时,日志级别为noticewarn的消息也将被发布。

建议使用至少crit的级别。

For example:

LogLevel notice

Note

当登录到常规文件时,无法抑制级别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>

Note

每个目录的日志级别配置仅影响解析请求后记录的消息以及与请求相关联的消息。与连接或服务器关联的日志消息不受影响。

See also

MaxKeepAliveRequests Directive

Description:持久连接上允许的请求数
Syntax:MaxKeepAliveRequests number
Default:MaxKeepAliveRequests 100
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

For example:

MaxKeepAliveRequests 500

MaxRangeOverlaps Directive

Description:返回完整资源之前允许的重叠范围数(例如100-200,150-300)
Syntax:MaxRangeOverlaps default | unlimited | none | number-of-ranges
Default:MaxRangeOverlaps 20
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.3.15 和更高版本中可用

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

  • default

    • 将重叠范围的数量限制为编译时默认值为 20.
  • none

    • 不允许重叠的 Range Headers。
  • unlimited

    • 服务器不限制其愿意满足的重叠范围的数量。
  • number-of-ranges

    • 一个正数,表示服务器愿意满足的最大重叠范围数。

MaxRangeReversals Directive

Description:返回完整资源之前允许的范围反转次数(例如:100-200,50-70)
Syntax:MaxRangeReversals default | unlimited | none | number-of-ranges
Default:MaxRangeReversals 20
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.3.15 和更高版本中可用

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

  • default

    • 将范围反转的次数限制为编译时默认值 20.
  • none

    • 不允许范围反转 Headers。
  • unlimited

    • 服务器不限制它愿意满足的范围反转次数。
  • number-of-ranges

    • 一个正数,表示服务器愿意满足的最大范围反转数。

MaxRanges Directive

Description:返回完整资源之前允许的范围数
Syntax:MaxRanges default | unlimited | none | number-of-ranges
Default:MaxRanges 200
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.3.15 和更高版本中可用

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

  • default

    • 将范围数限制为编译时默认值 200.
  • none

    • 范围 Headers 将被忽略。
  • unlimited

    • 服务器不限制其愿意满足的范围数。
  • number-of-ranges

    • 一个正数,表示服务器愿意满足的最大范围数。

MergeSlashes Directive

Description:控制服务器是否合并 URL 中的连续斜杠。
Syntax:MergeSlashes ON|OFF
Default:MergeSlashes ON
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:在 2.4.39 中添加

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

将 URL Map 到文件系统时,这些多个斜杠并不重要。但是,URL 的其他处理方式(例如 CGI 或代理)可能更喜欢保留多个连续斜杠的含义。在这些情况下,可以将MergeSlashes设置为* OFF *以保留多个连续的斜杠。在这些配置中,配置文件中使用的与 URL 的路径部分(LocationMatchRewriteRule,...)相匹配的正则表达式需要考虑多个连续的斜杠。

MergeTrailers Directive

Description:确定预告片是否合并到标题中
Syntax:MergeTrailers [on|off]
Default:MergeTrailers off
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:2 .4.11 及更高版本

该指令控制是否将 HTTP 预告片复制到 HTTP Headers 的内部表示中。当大多数请求头处理将有机会检查或修改请求头后,请求主体已被完全消耗时,将发生这种合并。

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

Mutex Directive

Description:为所有或指定的互斥配置互斥机制并锁定文件目录
Syntax:Mutex mechanism [default|mutex-name] ... [OmitPID]
Default:Mutex default
Context:server config
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.3.4 和更高版本中可用

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

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

  • APR选择的默认机制出现功能或性能问题时,更改互斥机制

  • 当默认目录不支持锁定时,更改基于文件的互斥对象使用的目录

Supported modules

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

下列互斥锁机制可用:

  • default | yes

这将选择由APR确定的默认锁定实现。可以通过使用-V选项运行httpd来显示默认的锁定实现。

  • none | no

这有效地禁用了互斥锁,并且仅当模块指示它是有效选择时才允许互斥锁使用。有关更多信息,请查阅模块文档。

  • posixsem

这是基于 Posix signal 量的 Mutex 变体。

Warning

如果进程中的某个线程持有互斥段错误,则 signal 所有权将无法恢复,从而导致 Web 服务器挂起。

  • sysvsem

这是基于 SystemV IPC signal 量的 Mutex 变体。

Warning

如果进程在删除 signal 之前崩溃,则有可能“泄漏” SysV signal。

Security

signal 量 API 允许在与 Web 服务器相同的 uid 下运行的任何 CGI 拒绝服务攻击(,即,所有 CGI,除非您使用类似suexeccgiwrapper的东西)。

  • sem

这将选择“最佳”可用 signal 量实现,并按此 Sequences 在 Posix 和 SystemV IPC signal 量之间进行选择。

  • pthread

这是基于跨进程 Posix 线程互斥量的 Mutex 变体。

Warning

在大多数系统上,如果子进程在持有使用此实现的互斥锁的同时异常终止,则服务器将死锁并停止响应请求。发生这种情况时,服务器将需要手动重启才能恢复。

Solaris 和 Linux 是显着的 exception,因为它们提供了一种机制,该机制通常允许子进程在持有互斥锁异常终止后恢复互斥锁。

如果您的系统兼容 POSIX 或实现了pthread_mutexattr_setrobust_np()功能,则可以安全地使用pthread选项。

  • fcntl:/path/to/mutex

这是 Mutex 的变体,其中物理(锁定)文件和fcntl()函数用作 Mutex。

Warning

在多线程,多进程环境中使用基于此机制的多个互斥锁时,如果fcntl()不是线程感知的,则可以报告有效的互斥锁操作的死锁错误(EDEADLK),例如在 Solaris 上。

  • flock:/path/to/mutex

除了使用flock()函数提供文件锁定外,此方法类似于fcntl:/path/to/mutex方法。

  • file:/path/to/mutex

这将选择“最佳”可用文件锁定实现,并按此 Sequences 在fcntlflock之间进行选择。

大多数机制仅在基础平台和APR支持的选定平台上可用。并非在所有平台上都可用的机制是* posixsem sysvsem sem pthread fcntl flock file *。

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

Security

最好避免将互斥文件放在世界可写目录(例如/var/tmp)中,因为有人可能会创建拒绝服务攻击并通过创建与服务器尝试使用的名称相同的名称的锁定文件来阻止服务器启动。Creating。

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

Mutex nameModule(s)Protected resource
mpm-acceptpreforkworker MPM传入的连接,以避免打雷的牧群问题;有关更多信息,请参阅performance tuning文档
authdigest-clientmod_auth_digest共享内存中的 Client 端列表
authdigest-opaquemod_auth_digest共享内存中的计数器
ldap-cachemod_ldapLDAP 结果缓存
rewrite-mapmod_rewrite与外部 Map 程序进行通信,以避免来自多个请求的混合 I/O
ssl-cachemod_sslSSL 会话缓存
ssl-staplingmod_sslOCSP 装订响应缓存
watchdog-callbackmod_watchdog特定 Client 端模块的回调函数

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

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

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

NameVirtualHost Directive

Description:弃用:指定用于名称虚拟主机的 IP 地址
Syntax:NameVirtualHost addr[:port]
Context:server config
Status:Core
Module:core

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

该指令当前无效。

See also

Options Directive

Description:配置特定目录中可用的功能
Syntax:Options [+|-]option [[+|-]option] ...
Default:Options FollowSymlinks
Context:服务器配置,虚拟主机,目录,.htaccess
Override:Options
Status:Core
Module:core
Compatibility:在 2.3.11 中将默认值从 All 更改为 FollowSymlinks

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

选项可以设置为None,在这种情况下,不会启用任何其他功能,或者以下一项或多项功能:

  • All

    • MultiViews以外的所有选项。
  • ExecCGI

    • 允许使用mod_cgi执行 CGI 脚本。
  • FollowSymLinks

    • 服务器将遵循此目录中的符号链接。这是默认设置。

Note

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

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

忽略此选项不应被视为安全限制,因为符号链接测试会受到使其无法回避的竞争条件的影响。

  • Includes

  • IncludesNOEXEC

    • 服务器端包含是允许的,但是#exec cmd#exec cgi被禁用。仍然可以从ScriptAlias ed 目录中#include virtual CGI 脚本。
  • Indexes

    • 如果请求 Map 到目录的 URL,并且该目录中没有DirectoryIndex(例如index.html),则mod_autoindex将返回该目录的格式列表。
  • MultiViews

Note

如果设置为<Directory>以外的其他位置,则此选项将被忽略,因为mod_negotiation需要实际资源进行比较和评估。

  • SymLinksIfOwnerMatch

    • 服务器将仅遵循符号链接,这些符号链接的目标文件或目录由与该链接相同的用户标识拥有。

Note

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

该选项不应被视为安全限制,因为符号链接测试会受到使其无法回避的竞争条件的影响。

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

Note

Options+-与没有_混合是无效的语法,并且在服务器启动期间将被语法检查(带有中止)拒绝。

例如,没有任何+-符号:

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

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

那么只会为/web/docs/spec目录设置Includes。但是,如果第二个Options指令使用+-符号:

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

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

然后为/web/docs/spec目录设置了选项FollowSymLinksIncludes

Note

无论先前的设置如何,使用-IncludesNOEXEC-Includes都将完全禁用服务器端包含。

没有任何其他设置的默认值为FollowSymlinks

Protocol Directive

Description:监听套接字协议
Syntax:Protocol protocol
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:在 Apache 2.1.5 和更高版本中可用。在 Windows 上,从 Apache 2.3.3 及更高版本开始。

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

如果您在非标准端口上运行,则只需要设置协议即可;否则,对于端口 80 假定http,对于端口 443 假定https

例如,如果您在非标准端口上运行https,则显式指定协议:

Protocol https

您也可以使用Listen指令指定协议。

See also

Protocols Directive

Description:服务器/虚拟主机可用的协议
Syntax:Protocols protocol ...
Default:Protocols http/1.1
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:仅在 Apache 2.4.17 及更高版本中可用。

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

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

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

Protocols h2 http/1.1

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

指定不可用/禁用的协议是安全的。这样的协议名称将被简单地忽略。

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

See also

ProtocolsHonorOrder Directive

Description:确定协议的 Sequences 是否确定协商期间的优先级
Syntax:ProtocolsHonorOrder On|Off
Default:ProtocolsHonorOrder On
Context:服务器配置,虚拟主机
Status:Core
Module:core
Compatibility:仅在 Apache 2.4.17 及更高版本中可用。

该指令指定服务器是否应遵循Protocols指令列出协议的 Sequences。

如果配置为“关”,则 Client 端提供的协议列表 Sequences 优先于服务器配置中的 Sequences。

ProtocolsHonorOrder设置为on(默认)后,Client 端 Sequences 无关紧要,只有服务器设置中的 Sequences 会影响协议协商的结果。

See also

QualifyRedirectURL Directive

Description:控制 REDIRECT_URL 环境变量是否完全合格
Syntax:QualifyRedirectURL On|Off
Default:QualifyRedirectURL Off
Context:服务器配置,虚拟主机,目录
Override:FileInfo
Status:Core
Module:core
Compatibility:2.4.18 及更高版本中支持的指令。 2.4.17 就像配置了“ QualifyRedirectURL On”一样。

该指令控制服务器是否将确保 REDIRECT_URL 环境变量是完全合格的。默认情况下,该变量包含 Client 端请求的逐字网址,例如“ /index.html”。对于QualifyRedirectURL On,相同的请求将产生一个值,例如“ http://www.example.com/index.html”。

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

RegexDefaultOptions Directive

Description:允许为正则表达式配置全局/默认选项
Syntax:RegexDefaultOptions [none] [+|-]option [[+|-]option] ...
Default:RegexDefaultOptions DOTALL DOLLAR_ENDONLY
Context:server config
Status:Core
Module:core
Compatibility:仅在 Apache 2.4.30 及更高版本中可用。

该指令将某些默认行为添加到以后使用的 ANY 正则表达式中。

任何以“”开头的选项都将添加到已设置的选项中。
任何以“-”开头的选项将从已设置的选项中删除。
将设置任何不带''或'-'的选项,并删除任何其他已设置的选项。
none关键字会重置所有已设置的选项。

选项可以是:

  • ICASE

    • 使用不区分大小写的匹配。
  • EXTENDED

    • Perl 的/ x 标志,忽略(未转义的)空格和模式中的 Comments。
  • 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
...

RegisterHttpMethod Directive

Description:注册非标准的 HTTP 方法
Syntax:RegisterHttpMethod method [method [...]]
Context:server config
Status:Core
Module:core
Compatibility:在 Apache HTTP Server 2.4.24 和更高版本中可用

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

See also

RLimitCPU Directive

Description:限制由 Apache httpd 子级启动的进程的 CPU 消耗
Syntax:RLimitCPU seconds|max [seconds|max]
Default:Unset; uses operating system defaults
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

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

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

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

See also

RLimitMEM Directive

Description:限制由 Apache httpd 子级启动的进程的内存消耗
Syntax:RLimitMEM bytes|max [bytes|max]
Default:Unset; uses operating system defaults
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

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

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

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

See also

RLimitNPROC Directive

Description:限制 Apache httpd 子级启动的进程可以启动的进程数
Syntax:RLimitNPROC number|max [number|max]
Default:Unset; uses operating system defaults
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

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

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

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

Note

如果 CGI 进程不是在非 Web 服务器用户 ID 的用户 ID 下运行,则此伪指令将限制服务器本身可以创建的进程数。这种情况的证据将由error_log中的 cannot fork 消息指示。

See also

ScriptInterpreterSource Directive

Description:为 CGI 脚本定位解释器的技术
Syntax:ScriptInterpreterSource Registry|Registry-Strict|Script
Default:ScriptInterpreterSource Script
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:Win32 only.

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

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

或者,如果perlPATH中,则只需:

#!perl

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

Security

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

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

SeeRequestTail Directive

Description:假设请求本身大于 63 个字符,请确定 mod_status 是显示请求的前 63 个字符还是显示最后 63 个字符。
Syntax:SeeRequestTail On|Off
Default:SeeRequestTail Off
Context:server config
Status:Core
Module:core
Compatibility:在 Apache httpd 2.2.7 和更高版本中可用。

带有ExtendedStatus On的 mod_status 显示正在处理的实际请求。出于历史目的,实际上仅存储了 63 个字符用于显示。该指令控制是否存储第 63 个字符(前一个行为和默认行为)或是否存储最后 63 个字符。当然,这仅在请求的长度为 64 个字符或更大时才适用。

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

Off (default)GET /disk1/storage/apache/htdocs/images/imagestore1/food/apples
Onorage/apache/htdocs/images/imagestore1/food/apples.jpg HTTP/1.1

ServerAdmin Directive

Description:服务器在发送给 Client 端的错误消息中包含的电子邮件地址
Syntax:ServerAdmin email-address|URL
Context:服务器配置,虚拟主机
Status:Core
Module:core

ServerAdmin设置服务器在返回给 Client 端的任何错误消息中所包含的联系地址。如果httpd不能将提供的参数识别为 URL,则认为这是一个电子邮件地址,并在超链接目标中以mailto:开头。但是,建议使用实际的电子邮件地址,因为有许多 CGI 脚本可以进行此假设。如果要使用 URL,则它应指向您控制下的另一台服务器。否则,如果出现错误,用户可能无法与您联系。

为此可能需要设置一个专用地址,例如

ServerAdmin [email protected]

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

ServerAlias Directive

Description:将请求与名称虚拟主机匹配时使用的主机的备用名称
Syntax:ServerAlias hostname [hostname] ...
Context:virtual host
Status:Core
Module:core

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

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

最佳匹配的<virtualhost>的基于名称的虚拟主机将按照它们在配置中出现的 Sequences 进行处理。使用第一个匹配的ServerNameServerAlias,通配符的优先级没有不同(服务器名与 ServerAlias 也不相同)。

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

See also

ServerName Directive

Description:服务器用来标识自己的主机名和端口
Syntax:ServerName [scheme://]domain-name|ip-address[:port]
Context:服务器配置,虚拟主机
Status:Core
Module:core

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

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

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

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

ServerName www.example.com

ServerName指令可以出现在服务器定义内的任何位置。但是,每个外观都将覆盖先前的外观(在该服务器内)。

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

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

如果您使用的是基于名称的虚拟主机,则<VirtualHost>部分中的ServerName指定必须在请求的Host:Headers 中出现的主机名才能与该虚拟主机匹配。

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

有关设置的信息,请参见UseCanonicalNameUseCanonicalPhysicalPort伪指令的描述,这些设置确定自引用 URL(例如mod_dir模块)将引用指定的端口还是 Client 端请求中指定的端口号。

Warning

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

httpd: Could not reliably determine the server's fully qualified domain name, using rocinante.local for ServerName

See also

ServerPath Directive

Description:不兼容的浏览器访问的基于名称的虚拟主机的旧版 URL 路径名
Syntax:ServerPath URL-path
Context:virtual host
Status:Core
Module:core

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

See also

ServerRoot Directive

Description:服务器安装的基本目录
Syntax:ServerRoot directory-path
Default:ServerRoot /usr/local/apache
Context:server config
Status:Core
Module:core

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

ServerRoot "/home/httpd"

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

See also

ServerSignature Directive

Description:在服务器生成的文档上配置页脚
Syntax:ServerSignature On|Off|EMail
Default:ServerSignature Off
Context:服务器配置,虚拟主机,目录,.htaccess
Override:All
Status:Core
Module:core

ServerSignature伪指令允许在服务器生成的文档(错误消息,mod_proxy ftp 目录列表,mod_info输出等)下的尾页尾行进行配置。之所以要启用这样的页脚行,是因为在代理链中,用户通常无法分辨哪个链式服务器实际产生了返回的错误消息。

Off设置是默认设置,禁止显示页脚行。 On设置仅在服务器版本号和所服务虚拟主机的ServerName之间添加一行,而EMail设置另外创建对所引用文档的ServerAdmin的“ mailto:”引用。

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

See also

ServerTokens Directive

Description:配置Server HTTP 响应 Headers
Syntax:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
Default:ServerTokens Full
Context:server config
Status:Core
Module:core

此伪指令控制发送回 Client 端的Server响应头字段是否包括服务器的通用 OS 类型的描述以及有关内置模块的信息。

  • 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指令显示的信息。

Note

不建议将ServerTokens设置为小于minimal,因为这样会使调试互操作问题更加困难。另请注意,禁用 Server:Headers 根本没有任何作用来使您的服务器更安全。 “默默无闻的安全”的想法是一个神话,并导致错误的安全感。

See also

SetHandler Directive

Description:强制所有匹配文件由处理程序处理
Syntax:SetHandler handler-name|none|expression
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core
Compatibility:表达式参数 2.4.19 及更高版本

当放置在.htaccess文件或<Directory><Location>节中时,此伪指令强制通过处理程序名称给定的handler解析所有匹配的文件。例如,如果您有一个目录想要完全解析为 imagemap 规则文件,而不管其 extensions 如何,则可以将以下内容放入该目录中的.htaccess文件中:

SetHandler imap-file

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

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

您也可以使用此伪指令为具有特定文件 extensions 的文件配置特定处理程序。例如:

<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指令。

Note

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

See also

SetInputFilter Directive

Description:设置将处理 Client 端请求和 POST Importing 的过滤器
Syntax:SetInputFilter filter[;filter...]
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core

SetInputFilter伪指令设置一个或多个过滤器,这些过滤器将在服务器接收到 Client 端请求和 POST Importing 时处理它们。这是在其他地方定义的所有过滤器的补充,包括AddInputFilter指令。

如果指定了多个过滤器,则必须使用分号将它们按处理内容的 Sequences 分隔开。

See also

SetOutputFilter Directive

Description:设置将处理服务器响应的过滤器
Syntax:SetOutputFilter filter[;filter...]
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Core
Module:core

SetOutputFilter指令设置了筛选器,该筛选器将在将来自服务器的响应发送给 Client 端之前对其进行处理。这是在其他地方定义的所有过滤器的补充,包括AddOutputFilter指令。

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

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

如果指定了多个过滤器,则必须使用分号将它们按处理内容的 Sequences 分隔开。

See also

TimeOut Directive

Description:服务器在失败请求之前 await 某些事件的时间
Syntax:TimeOut seconds
Default:TimeOut 60
Context:服务器配置,虚拟主机
Status:Core
Module:core

TimeOut指令定义了 Apache httpd 在各种情况下 await I/O 的时间:

  • 从 Client 端读取数据时,如果读取缓冲区为空,则 await TCP 数据包到达的时间。

对于新连接上的初始数据,该指令直到任何已配置的AcceptFilter将新连接传递到服务器后才生效。

  • 将数据写入 Client 端时,如果发送缓冲区已满,则 await 数据包确认的时间。

  • mod_cgimod_cgid中,await CGI 脚本的任何单个输出块的时间长度。

  • mod_ext_filter中,await 过滤过程输出的时间。

  • mod_proxy中,如果未配置ProxyTimeout,则为默认超时值。

TraceEnable Directive

Description:确定对TRACE个请求的行为
Syntax:TraceEnable [on|off|extended]
Default:TraceEnable on
Context:服务器配置,虚拟主机
Status:Core
Module:core

对于核心服务器和mod_proxy,此伪指令将覆盖TRACE的行为。默认TraceEnable on允许每个 RFC 2616 发出TRACE个请求,这不允许任何请求主体伴随该请求。 TraceEnable off导致核心服务器和mod_proxy向 Client 端返回405(不允许方法)错误。

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

Note

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

UnDefine Directive

Description:不确定变量的存在
Syntax:UnDefine parameter-name
Context:server config
Status:Core
Module:core

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

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

尽管虚拟主机上下文中支持此指令,但其所作的更改对于任何后续的配置指令(除了任何封闭的虚拟主机)都是可见的。

See also

UseCanonicalName Directive

Description:配置服务器如何确定自己的名称和端口
Syntax:UseCanonicalName On|Off|DNS
Default:UseCanonicalName Off
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core

在许多情况下,Apache httpd 必须构造一个*“自我引用” URL,即一个指向同一服务器的 URL。对于UseCanonicalName On,Apache httpd 将使用ServerName指令中指定的主机名和端口来构造服务器的规范名称。此名称用于所有自引用 URL 中,并用于 CGI 中的SERVER_NAMESERVER_PORT值。

如果使用UseCanonicalName Off,Apache httpd 将使用 Client 端提供的主机名和端口(如果提供了主机名和端口)来形成自我引用的 URL(否则,它将使用规范名称,如上定义)。这些值与用于实现基于名称的虚拟主机的值相同,并且可用于相同的 Client 端。 CGI 变量SERVER_NAMESERVER_PORT也将从 Client 端提供的值构造。

一个可能有用的示例是 Intranet 服务器上,在该服务器上,用户使用短名称(例如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:Headers 的古老 Client 端。使用此选项,Apache httpd 在 Client 端连接到的服务器 IP 地址上执行反向 DNS 查找,以计算出自引用 URL。

Warning

如果 CGI 对SERVER_NAME的值进行假设,则此选项可能会破坏它们。Client 端实际上可以自由地提供他们想要的任何值作为主机名。但是,如果 CGI 仅使用SERVER_NAME来构造自我引用的 URL,那么就可以了。

See also

UseCanonicalPhysicalPort Directive

Description:配置服务器如何确定自己的端口
Syntax:UseCanonicalPhysicalPort On|Off
Default:UseCanonicalPhysicalPort Off
Context:服务器配置,虚拟主机,目录
Status:Core
Module:core

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

Note

使用物理端口时查找的 Sequences 如下:

  • UseCanonicalName On

  • Physical port

  • Default port

  • UseCanonicalName Off | DNS

    • 已从Host:Headers 解析端口
  • Physical port

  • Servername中提供的端口

  • Default port

对于UseCanonicalPhysicalPort Off,将从 Order 中删除物理端口。

See also


Directive

Description:包含仅适用于特定主机名或 IP 地址的指令
Syntax:<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
Context:server config
Status:Core
Module:core

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

  • 虚拟主机的 IP 地址;

  • 虚拟主机 IP 地址的标准域名(不建议);

  • 字符*,用作通配符并与任何 IP 地址匹配。

  • 字符串_default_,它是*的别名

<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命令完成-如果您的 os 支持该命令)。

Note

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

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

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

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

Security

请参阅security tips文档,以详细了解如果启动日志的用户以外的任何人都可写日志文件存储目录的原因,那么为什么安全性会受到损害。

See also