Apache HTTP 服务器版本 2.4
描述 | 为协议侦听套接字配置优化 |
---|---|
语法 | 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
设置,如上所示。
描述 | 资源接受尾随路径名信息 |
---|---|
语法 | 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-script 和 isapi-handler)通常默认接受 PATH_INFO
。AcceptPathInfo
指令的主要目的是允许你覆盖处理程序接受或拒绝 PATH_INFO
的选择。例如,当你使用过滤器(例如 INCLUDES)根据 PATH_INFO
生成内容时,需要此覆盖。核心处理程序通常会拒绝请求,因此你可以使用以下配置来启用此类脚本
<Files "mypaths.shtml"> Options +Includes SetOutputFilter INCLUDES AcceptPathInfo On </Files>
描述 | 分布式配置文件的名称 |
---|---|
语法 | 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>
描述 | 当响应内容类型为 text/plain 或 text/html 时要添加的默认字符集参数 |
---|---|
语法 | AddDefaultCharset On|Off|charset |
默认 | AddDefaultCharset Off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
此指令指定要添加到响应中的媒体类型字符集参数(字符编码的名称)的默认值,当且仅当响应的内容类型为 text/plain
或 text/html
时。这应该覆盖通过 META
元素在响应正文中指定的任何字符集,尽管确切的行为通常取决于用户的客户端配置。AddDefaultCharset Off
设置禁用此功能。AddDefaultCharset On
启用 iso-8859-1
的默认字符集。任何其他值都假定为要使用的 charset,它应该是IANA 注册的字符集值之一,用于互联网媒体类型(MIME 类型)。例如
AddDefaultCharset utf-8
AddDefaultCharset
仅在所有应用于它的文本资源都已知采用该字符编码并且单独标记其字符集非常不方便时才应使用。一个这样的示例是将字符集参数添加到包含生成内容的资源中,例如可能由于用户提供的数据包含在输出中而容易遭受跨站点脚本攻击的传统 CGI 脚本。但是,请注意,更好的解决方案是只修复(或删除)这些脚本,因为设置默认字符集并不能保护已在其浏览器上启用“自动检测字符编码”功能的用户。
描述 | 确定是否允许 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
作为安全措施。允许解码斜杠可能会允许不安全的路径。
描述 | 允许在 .htaccess 文件中使用的指令类型 |
---|---|
语法 | AllowOverride All|None|指令类型 [指令类型] ... |
默认 | AllowOverride None(2.3.9 及更高版本),AllowOverride All(2.3.8 及更低版本) |
上下文 | 目录 |
状态 | 核心 |
模块 | 核心 |
当服务器找到一个 .htaccess
文件(如 AccessFileName
指定)时,它需要知道该文件中声明的哪些指令可以覆盖较早的配置指令。
AllowOverride
仅在未指定正则表达式的 <Directory>
部分中有效,而不是在 <Location>
、<DirectoryMatch>
或 <Files>
部分中有效。当此指令设置为 None
,并且 AllowOverrideList
设置为 None
时,.htaccess 文件将被完全忽略。在这种情况下,服务器甚至不会尝试读取文件系统中的 .htaccess
文件。
当此指令设置为 All
时,则任何具有 .htaccess 上下文 的指令都允许在 .htaccess
文件中使用。
指令类型 可以是以下指令分组之一。(有关每个 指令类型 启用了哪些指令的最新列表,请参见 覆盖类索引。)
AuthDBMGroupFile
、AuthDBMUserFile
、AuthGroupFile
、AuthName
、AuthType
、AuthUserFile
、Require
,等等)。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
, Deny
和 Order
)。请注意,有效指令中的语法错误仍会导致内部服务器错误。
Options
和 XBitHack
)。可以给出一个等号,后面跟一个用逗号分隔的选项列表,不带空格,这些选项可以使用 Options
命令设置。即使可以使用此指令限制在 .htaccess 文件中使用的选项列表,只要允许任何 Options
指令,就可以使用非相对语法禁用任何其他继承的选项。换句话说,此机制不能强制特定选项保持设置状态,同时允许设置任何其他选项。
AllowOverride Options=Indexes,MultiViews
示例
AllowOverride AuthConfig Indexes
在上面的示例中,所有既不在 AuthConfig
组中也不在 Indexes
组中的指令都会导致内部服务器错误。
出于安全和性能原因,不要在 <Directory "/">
块中将 AllowOverride
设置为 None
以外的任何值。相反,找到(或创建)引用你实际计划放置 .htaccess
文件的目录的 <Directory>
块。
描述 | 在 .htaccess 文件中允许的各个指令 |
---|---|
语法 | AllowOverrideList None|指令 [指令类型] ... |
默认 | AllowOverrideList None |
上下文 | 目录 |
状态 | 核心 |
模块 | 核心 |
当服务器找到一个 .htaccess
文件(如 AccessFileName
指定)时,它需要知道该文件中声明的哪些指令可以覆盖较早的配置指令。
AllowOverrideList
仅在未指定正则表达式的 <Directory>
部分中有效,在 <Location>
、<DirectoryMatch>
或 <Files>
部分中无效。当此指令设置为 None
且 AllowOverride
设置为 None
时,.htaccess 文件将被完全忽略。在这种情况下,服务器甚至不会尝试读取文件系统中的 .htaccess
文件。
示例
AllowOverride None AllowOverrideList Redirect RedirectMatch
在上面的示例中,只允许 Redirect
和 RedirectMatch
指令。所有其他指令都会导致内部服务器错误。
示例
AllowOverride AuthConfig AllowOverrideList CookieTracking CookieName
在上面的示例中,AllowOverride
授予 AuthConfig
指令分组的权限,AllowOverrideList
仅授予 FileInfo
指令分组中两个指令的权限。所有其他指令都会导致内部服务器错误。
描述 | 用于查找 CGI 脚本解释器的技术 |
---|---|
语法 | CGIMapExtension cgi-path .extension |
上下文 | 目录,.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
兼容性 | 仅限 NetWare |
此指令用于控制 Apache httpd 如何查找用于运行 CGI 脚本的解释器。例如,设置 CGIMapExtension sys:\foo.nlm .foo
将导致所有扩展名为 .foo
的 CGI 脚本文件传递给 FOO 解释器。
描述 | 启用将 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_cgi
、mod_cgid
、mod_proxy_fcgi
、mod_proxy_scgi
等。值得注意的是,它会影响那些不以通常意义处理请求但仍然使用此 API 的模块;此类模块的示例包括 mod_include
和 mod_ext_filter
。不使用 ap_add_common_vars()
的第三方模块也可以选择尊重此设置。
描述 | 控制如何设置某些 CGI 变量 |
---|---|
语法 | CGIVar variable rule |
上下文 | 目录,.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 Apache HTTP Server 2.4.21 及更高版本中可用 |
此指令控制如何设置某些 CGI 变量。
REQUEST_URI 规则
original-uri
(默认值)current-uri
描述 | 启用生成 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 脚本的输出和字节范围响应没有此头。
描述 | 服务器运行时文件的基目录 |
---|---|
语法 | DefaultRuntimeDir directory-path |
默认 | DefaultRuntimeDir DEFAULT_REL_RUNTIMEDIR (logs/) |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 Apache 2.4.2 及更高版本中可用 |
DefaultRuntimeDir
指令设置服务器将创建各种运行时文件(共享内存、锁等)的目录。如果设置为相对路径,则完整路径将相对于 ServerRoot
。
示例
DefaultRuntimeDir scratch/
DefaultRuntimeDir
的默认位置可以通过在构建时更改 DEFAULT_REL_RUNTIMEDIR
#define 来修改。
注意:ServerRoot
应在此指令使用之前指定。否则,将使用 ServerRoot
的默认值来设置基目录。
ServerRoot
的权限描述 | 此指令除了在值不是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 头字段的响应,而接收者可能会尝试猜测媒体类型。
描述 | 定义变量 |
---|---|
语法 | 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
的语法冲突。
虽然此指令在虚拟主机上下文中受支持,但它所做的更改对任何后续配置指令都是可见的,超出了任何封闭的虚拟主机。
描述 | 包含一组仅适用于命名的文件系统目录、子目录及其内容的指令。 |
---|---|
语法 | <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
的步骤如下
AllowOverride None
(禁用 .htaccess
文件)。AllowOverride FileInfo
(针对目录 /home
)。/home/.htaccess
、/home/web/.htaccess
和 /home/web/dir/.htaccess
中的任何 FileInfo
指令。在应用所有常规部分后才会考虑正则表达式。然后按其在配置文件中出现的顺序测试所有正则表达式。例如,使用
<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>
部分中。
描述 | 将适用于与正则表达式匹配的文件系统目录内容的指令括起来。 |
---|---|
语法 | <DirectoryMatch regex> ... </DirectoryMatch> |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
<DirectoryMatch>
和 </DirectoryMatch>
用于括起一组指令,这些指令仅适用于命名的目录(和其中的文件),与 <Directory>
相同。但是,它以 正则表达式 作为参数。例如
<DirectoryMatch "^/www/(.+/)?[0-9]{3}/"> # ... </DirectoryMatch>
匹配 /www/
(或其任何子目录)中由三个数字组成的目录。
<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>
<Directory>
,用于描述如何将正则表达式与常规 <Directory>
混合使用描述 | 从 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
时,不要使用尾部斜杠。
描述 | 包含仅当请求在运行时不满足先前 <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: 标头的请求。
<If>
<ElseIf>
<If>
、<ElseIf>
和 <Else>
。描述 | 包含仅当请求在运行时满足条件,而先前 <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>
将匹配。
<If>
<Else>
<If>
、<ElseIf>
和 <Else>
。描述 | 在传输过程中使用内存映射来读取文件 |
---|---|
语法 | EnableMMAP On|Off |
默认 | EnableMMAP On |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
此指令控制 httpd
在传输过程中需要读取文件内容时是否可以使用内存映射。默认情况下,当处理请求需要访问文件中的数据时(例如,使用 mod_include
传输服务器解析的文件时),如果操作系统支持,Apache httpd 会对文件进行内存映射。
此内存映射有时会提高性能。但在某些环境中,最好禁用内存映射以防止出现操作问题
对于容易出现这些问题的服务器配置,应通过指定以下内容来禁用已传递文件的内存映射
EnableMMAP Off
对于 NFS 挂载的文件,可以通过指定以下内容明确禁用该功能
<Directory "/path-to-nfs-files"> EnableMMAP Off </Directory>
描述 | 使用内核 sendfile 支持向客户端传递文件 |
---|---|
语法 | EnableSendfile On|Off |
默认 | EnableSendfile Off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.3.9 版本中,默认值已更改为 Off。 |
此指令控制 httpd
是否可以使用内核的 sendfile 支持将文件内容传输到客户端。默认情况下,当处理请求不需要访问文件中的数据(例如,在传递静态文件时),Apache httpd 会使用 sendfile 传递文件内容,而无需读取文件(如果操作系统支持)。
此 sendfile 机制避免了单独的读取和发送操作以及缓冲区分配。但在某些平台或某些文件系统中,最好禁用此功能以避免操作问题
sendfile
可能无法处理大小超过 2GB 的文件。DocumentRoot
(例如,NFS、SMB、CIFS、FUSE),内核可能无法通过其自己的缓存提供网络文件。对于不容易出现这些问题的服务器配置,可以通过指定以下内容来启用此功能
EnableSendfile On
对于网络挂载的文件,可以通过指定以下内容明确禁用该功能
<Directory "/path-to-nfs-files"> EnableSendfile Off </Directory>
请注意,EnableSendfile
的每个目录和 .htaccess 配置不受 mod_cache_disk
支持。该模块仅考虑 EnableSendfile
的全局定义。
描述 | 使用自定义错误消息中止配置解析 |
---|---|
语法 | 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>
部分中来进行条件评估。
描述 | 服务器在发生错误时将返回给客户端的内容 |
---|---|
语法 | ErrorDocument error-code document |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
在出现问题或错误时,可以将 Apache httpd 配置为执行以下四项操作之一,
第一个选项是默认选项,而选项 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 将不会为代理内容生成自定义错误文档。
描述 | 服务器记录错误的位置 |
---|---|
语法 | 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 平台上输入文件路径时,即使该平台允许使用反斜杠,也应注意仅使用正斜杠。总的来说,最好始终在配置文件中使用正斜杠。
描述 | 错误日志条目的格式规范 |
---|---|
语法 | ErrorLogFormat [connection|request] format |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
ErrorLogFormat
允许指定除了实际日志消息之外在错误日志中记录的补充信息。
#Simple example ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client %a] %M"
将 connection
或 request
指定为第一个参数允许指定其他格式,导致在为特定连接或请求记录第一条消息时记录其他信息。此附加信息仅在每个连接/请求中记录一次。如果处理连接或请求时未导致任何日志消息,则也不会记录附加信息。
某些格式字符串项可能不会产生输出。例如,只有当日志消息与请求关联并且日志消息发生在已从客户端读取 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"
描述 | 跟踪每个请求的扩展状态信息 |
---|---|
语法 | ExtendedStatus On|Off |
默认 | ExtendedStatus Off[*] |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
此选项跟踪每个工作进程的附加数据,有关当前执行的请求,并创建一个利用率摘要。您可以通过配置 mod_status
在运行时查看这些变量。请注意,其他模块可能依赖于此记分板。
此设置适用于整个服务器,不能逐个虚拟主机启用或禁用。收集扩展状态信息可能会使服务器变慢。另外请注意,此设置不能在平滑重启期间更改。
请注意,加载 mod_status
会将默认行为更改为 ExtendedStatus On,而其他第三方模块也可能这样做。此类模块依赖于收集有关所有工作进程状态的详细信息。默认值由 mod_status
从 2.3.6 版开始更改。之前的默认值始终为 Off。
描述 | 用于为静态文件创建 ETag HTTP 响应标头的文件属性 |
---|---|
语法 | FileETag component ... |
默认 | FileETag MTime Size |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.3.14 及更早版本中,默认值曾为“INode MTime Size”。 |
FileETag
指令配置用于在文档基于静态文件时创建 ETag
(实体标记)响应标头字段的文件属性。(ETag
值用于缓存管理,以节省网络带宽。)FileETag
指令允许您选择是否使用这些属性(如果有)。识别的关键字为
FileETag INode MTime Size
ETag
字段。ETag
字段INode
、MTime
、Size
和 Digest
关键字可以分别加上前缀 +
或 -
,这允许对从更广泛范围继承的默认设置进行更改。任何不带此类前缀出现的关键字都会立即且完全取消继承的设置。
如果目录的配置包括 FileETag INode MTime Size
,而子目录的配置包括 FileETag -INode
,则该子目录的设置(将由未覆盖它的任何子子目录继承)将等效于 FileETag MTime Size
。
mod_include
解析的响应不会生成 ETag,因为响应实体可以在不更改嵌入 SSI 指令的静态文件的 INode、MTime、Size 或 Digest 的情况下发生更改。描述 | 包含适用于匹配的文件名的指令 |
---|---|
语法 | <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>
部分。这允许用户逐个文件地控制对他们自己文件的访问。
描述 | 包含应用于正则表达式匹配文件名的指令 |
---|---|
语法 | <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>
描述 | 超过此数量的管道响应将被刷新到网络 |
---|---|
语法 | FlushMaxPipelined number |
默认 | FlushMaxPipelined 5 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 2.4.47 及更高版本 |
此指令允许配置管道响应的最大数量,只要收到管道请求,这些响应就会一直处于挂起状态。达到限制时,响应将以阻塞模式强制刷新到网络,直到再次低于限制。
FlushMaxPipelined
有助于限制内存使用。当设置为 0
时,管道将被禁用,当设置为 -1
时,没有限制(FlushMaxThreshold
仍然适用)。
描述 | 超过此阈值,挂起数据将被刷新到网络 |
---|---|
语法 | FlushMaxThreshold number-of-bytes |
默认 | FlushMaxThreshold 65535 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 2.4.47 及更高版本 |
此指令允许配置挂起输出数据(以字节为单位)的阈值。达到限制时,数据将以阻塞模式强制刷新到网络,直到再次低于限制。
FlushMaxThreshold
有助于限制内存使用。当设置为 0
或过小值时,实际上没有待处理数据,但对于线程化 MPM,可能会有更多线程繁忙地等待网络,因此可用于处理其他同时连接的线程更少。
描述 | 强制所有匹配文件在 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,此指令不起作用。
当 SetHandler
或 AddHandler
等明确指令不适用于当前请求时,通常由这些指令设置的内部处理程序名称将设置为与该指令指定的内容类型匹配。这是一些第三方模块(如 mod_php)可能使用“魔术”内容类型(仅用于向模块发出处理匹配请求的责任的信号)的历史行为。应通过使用 SetHandler
或 AddHandler
避免依赖于此类“魔术”类型的配置。
描述 | 将 gmon.out 分析数据写入的目录。 |
---|---|
语法 | GprofDir /tmp/gprof/|/tmp/gprof/% |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
当服务器已使用 gprof 分析支持进行编译时,GprofDir
会导致在进程退出时将 gmon.out
文件写入指定目录。如果参数以百分号('%')结尾,则会为每个进程 ID 创建子目录。
此指令目前仅适用于 prefork
MPM。
描述 | 对客户端 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
的设置如何,都将执行主机名查找。
描述 | 修改对 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/端口接口(而不是通过名称)进行配置才能得到遵守。
该指令接受以下选项列表中的三个参数,将默认值应用于未指定的参数
在此指令引入之前,Apache HTTP Server 请求消息解析器可以容忍许多不符合协议的输入形式。 RFC 7230 §9.4 请求拆分 和 §9.5 响应走私 仅指出了接受不符合要求的请求消息的两个潜在风险,而 RFC 7230 §3.5 “消息解析健壮性”指出了接受模糊空白和请求消息格式的风险。自引入此指令以来,所有语法规则都在默认 Strict
操作模式下强制执行,并且第 3.5 节建议的严格空白得到强制执行且无法放松。
强烈建议用户不要切换 Unsafe
操作模式,尤其是在面向外部的、可公开访问的服务器部署上。如果内联网上运行的故障监控或其他自定义服务使用者需要接口,用户应仅在配置为服务其内部专用网络的特定虚拟主机上切换 Unsafe 选项。
# 缺少 CRLF
GET / HTTP/1.0\n\n
某些工具需要强制使用 CRLF,否则 httpd 将返回 HTTP 400 响应,如上文用例中所述。例如,OpenSSL s_client 需要 -crlf 参数才能正常工作。
在检查 HTTP 请求以识别 CRLF 缺失等问题时,DumpIOInput
指令可以提供帮助。
RFC 7231 §4.1“请求方法” “概述”要求源服务器在请求行中遇到不受支持的方法时,应响应 HTTP 501 状态代码。当使用 LenientMethods
选项时,这种情况已经发生,但管理员可能希望切换 RegisteredMethods
选项,并使用 RegisterHttpMethod
指令注册任何非标准方法,特别是如果 Unsafe
选项已被切换。
对于正向代理主机,不应切换 RegisteredMethods
选项,因为源服务器支持的方法对代理服务器未知。
# 未知 HTTP 方法
WOW / HTTP/1.0\r\n\r\n
# 小写 HTTP 方法
get / HTTP/1.0\r\n\r\n
RFC 2616 §19.6“与以前版本的兼容性”鼓励 HTTP 服务器支持旧版 HTTP/0.9 请求。RFC 7230 用“已删除支持 HTTP/0.9 请求的期望”取代了这一点,并在 RFC 7230 附录 A 中提供了其他评论。Require1.0
选项允许用户删除对默认 Allow0.9
选项行为的支持。
# 不支持的 HTTP 版本
GET /\r\n\r\n
查看记录到 ErrorLog
的消息,该消息已使用 LogLevel
debug
级别进行配置,可以帮助识别此类错误请求及其来源。用户应特别注意访问日志中对意外拒绝的无效请求的 400 响应。
描述 | 包含仅在运行时请求满足条件时才应用的指令 |
---|---|
语法 | <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> 条件已经评估后设置,因此无法在此指令中使用。Define
、Include
和 Error
,不能通过将它们包含在 if <If>
配置部分中来使其有条件。这些部分始终是配置的一部分,无论它们在运行时如何评估。<ElseIf>
<Else>
<If>
、<ElseIf>
和 <Else>
。描述 | 如果在启动时测试为真,则包含将被处理的指令 |
---|---|
语法 | <IfDefine [!]parameter-name> ... </IfDefine> |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
<IfDefine test>...</IfDefine>
部分用于标记条件指令。<IfDefine>
部分内的指令仅在 test 为真时才会被处理。如果 test 为假,则开始和结束标记之间的所有内容都将被忽略。
<IfDefine>
部分指令中的 test 可以采用两种形式之一
!
parameter-name在前一种情况下,仅当名为 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>
描述 | 包含在特定指令存在或不存在时处理的指令 |
---|---|
语法 | <IfDirective [!]directive-name> ... </IfDirective> |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.4.34 及更高版本中可用。 |
<IfDirective test>...</IfDirective>
部分用于标记在特定指令存在时有条件的指令。<IfDirective>
部分内的指令仅在 test 为真时才会被处理。如果 test 为假,则开始和结束标记之间的所有内容都将被忽略。
<IfDirective>
部分中的 test 可以采用两种形式之一
在前一种情况下,仅当在处理时存在给定名称的指令时,开始和结束标记之间的指令才会被处理。第二种格式会反转测试,并且仅当 directive-name 不存在时才会处理指令。
httpd
的配置文件时,无论特定指令是否可用,才应使用此部分。在正常操作中,指令不需要放在 <IfDirective>
部分中。描述 | 仅当文件在启动时存在时才会包含将被处理的指令 |
---|---|
语法 | <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
参数在命令行中传入的服务器根目录进行检查。
描述 | 包含有条件处理特定模块存在或不存在的指令 |
---|---|
语法 | <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>
部分中。描述 | 包含在特定部分指令存在或不存在的情况下处理的指令 |
---|---|
语法 | <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>
部分中。描述 | 从服务器配置文件中包含其他配置文件 |
---|---|
语法 | 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
描述 | 从服务器配置文件中包含其他配置文件 |
---|---|
语法 | IncludeOptional file-path|directory-path|wildcard |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.3.6 及更高版本中提供。在 2.4.30 之后,没有通配符的不存在文件路径不会导致 SyntaxError |
此指令允许从服务器配置文件中包含其他配置文件。它的工作方式与 Include
指令相同,但如果使用通配符并且它们与任何文件或目录不匹配,或者文件路径在文件系统上不存在,则它将被静默忽略(而不是导致错误)。
描述 | 启用 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
指令的单个“请求”,无论使用该连接发送了多少个请求。
描述 | 服务器在持久连接上等待后续请求的时间量 |
---|---|
语法 | KeepAliveTimeout num[ms] |
默认 | KeepAliveTimeout 5 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
Apache httpd 等待后续请求关闭连接之前等待的秒数。通过添加 ms 后缀,也可以将超时设置为毫秒。一旦收到请求,将应用 Timeout
指令指定的超时值。
将 KeepAliveTimeout
设置为高值可能会导致负载较重的服务器出现性能问题。超时时间越长,服务器进程等待空闲客户端连接所占用的时间就越多。
如果未为基于名称的虚拟主机设置 KeepAliveTimeout
,将使用与本地 IP 和端口最匹配的第一个已定义虚拟主机的值。
描述 | 将封闭的访问控制仅限制为某些 HTTP 方法 |
---|---|
语法 | <Limit method [method] ... > ... </Limit> |
上下文 | 目录,.htaccess |
覆盖 | AuthConfig、Limit |
状态 | 核心 |
模块 | 核心 |
访问控制通常对所有访问方法有效,这是通常期望的行为。在一般情况下,不应将访问控制指令放在 <Limit>
部分中。
<Limit>
指令的目的是将访问控制的效果限制为指定的 HTTP 方法。对于所有其他方法,封闭在 <Limit>
括号中的访问限制将不起作用。以下示例仅将访问控制应用于 POST
、PUT
和 DELETE
方法,使所有其他方法不受保护
<Limit POST PUT DELETE> Require valid-user </Limit>
列出的方法名称可以是以下一个或多个:GET
、POST
、PUT
、DELETE
、CONNECT
、OPTIONS
、PATCH
、PROPFIND
、PROPPATCH
、MKCOL
、COPY
、MOVE
、LOCK
和 UNLOCK
。方法名称区分大小写。如果使用 GET
,它还将限制 HEAD
请求。TRACE
方法不能被限制(参见 TraceEnable
)。
<Limit>
和 <LimitExcept>
指令可以嵌套。在这种情况下,<Limit>
或 <LimitExcept>
指令的每个连续级别都必须进一步限制访问控制适用的方法集。
例如,根据以下配置,所有用户都将被授权进行 POST
请求,并且在所有情况下都将忽略 Require group editors
指令
<LimitExcept GET> Require valid-user </LimitExcept> <Limit POST> Require group editors </Limit>
描述 | 将访问控制限制为除指定方法之外的所有 HTTP 方法 |
---|---|
语法 | <LimitExcept method [method] ... > ... </LimitExcept> |
上下文 | 目录,.htaccess |
覆盖 | AuthConfig、Limit |
状态 | 核心 |
模块 | 核心 |
<LimitExcept>
和 </LimitExcept>
用于包含一组访问控制指令,这些指令随后将应用于参数中未列出的任何 HTTP 访问方法;也就是说,它与 <Limit>
部分相反,并且可用于控制标准和非标准/未识别方法。有关详细信息,请参阅 <Limit>
的文档。
例如
<LimitExcept POST GET> Require valid-user </LimitExcept>
描述 | 确定内部重定向和嵌套子请求的最大数量 |
---|---|
语法 | LimitInternalRecursion number [number] |
默认 | LimitInternalRecursion 10 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
例如,在使用 Action
指令时,会发生内部重定向,该指令在内部将原始请求重定向到 CGI 脚本。子请求是 Apache httpd 的机制,用于找出在请求某些 URI 时会发生什么。例如,mod_dir
使用子请求查找 DirectoryIndex
指令中列出的文件。
LimitInternalRecursion
可防止服务器在进入内部重定向或子请求的无限循环时崩溃。此类循环通常由错误配置引起。
该指令存储两个不同的限制,它们在每个请求的基础上进行评估。第一个 number 是可能连续发生的内部重定向的最大数量。第二个 number 确定子请求可以嵌套的深度。如果您只指定一个 number,它将被分配给这两个限制。
LimitInternalRecursion 5
描述 | 限制从客户端发送的 HTTP 请求正文的总大小 |
---|---|
语法 | LimitRequestBody bytes |
默认 | LimitRequestBody 1073741824 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 Apache HTTP Server 2.4.53 及更早版本中,默认值为 0(无限制) |
此指令指定请求正文中允许的 bytes 数量。0 的值表示无限制。
LimitRequestBody
指令允许用户在给定指令的上下文中(服务器、每个目录、每个文件或每个位置)设置对允许的 HTTP 请求消息正文大小的限制。如果客户端请求超过该限制,服务器将返回错误响应,而不是处理请求。正常请求消息正文的大小将根据资源的性质和该资源上允许的方法而有很大差异。CGI 脚本通常使用消息正文来检索表单信息。PUT
方法的实现将需要一个值,该值至少与服务器希望为该资源接受的任何表示一样大。
此指令使服务器管理员能够更好地控制异常的客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。
例如,如果您允许将文件上传到特定位置,并希望将上传文件的大小限制为 100K,则可以使用以下指令
LimitRequestBody 102400
描述 | 限制客户端可接受的 HTTP 请求头字段数 |
---|---|
语法 | LimitRequestFields number |
默认 | LimitRequestFields 100 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
将 number 设置为 0 表示不限。默认值由编译时常量 DEFAULT_LIMIT_REQUEST_FIELDS
定义(已发布的版本为 100)。
服务器管理员可使用 LimitRequestFields
指令修改 HTTP 请求中允许的请求头字段数限制。服务器需要此值大于普通客户端请求可能包含的字段数。客户端使用的请求头字段数很少会超过 20,但不同客户端实现之间可能有所不同,通常取决于用户配置其浏览器以支持详细内容协商的程度。可选 HTTP 扩展通常使用请求头字段表示。
此指令使服务器管理员能够更好地控制异常客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。如果普通客户端从服务器看到错误响应,表明请求中发送的字段过多,则应增加此值。
例如
LimitRequestFields 50
当使用基于名称的虚拟主机时,此指令的值取自本地 IP 和端口组合的默认(首选)虚拟主机。
描述 | 限制客户端允许的 HTTP 请求头大小 |
---|---|
语法 | LimitRequestFieldSize bytes |
默认 | LimitRequestFieldSize 8190 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
此指令指定 HTTP 请求头中允许的 bytes 数。
服务器管理员可使用 LimitRequestFieldSize
指令设置 HTTP 请求头字段允许大小的限制。服务器需要此值足够大,以便容纳普通客户端请求中的任何一个头字段。普通请求头字段的大小在不同的客户端实现之间会有很大差异,通常取决于用户配置其浏览器以支持详细内容协商的程度。SPNEGO 身份验证头最多可达 12392 字节。
此指令使服务器管理员能够更好地控制异常的客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。
例如
LimitRequestFieldSize 4094
当使用基于名称的虚拟主机时,此指令的值取自与当前 IP 地址和端口组合最匹配的默认(首选)虚拟主机。
描述 | 限制客户端可接受的 HTTP 请求行大小 |
---|---|
语法 | LimitRequestLine bytes |
默认 | LimitRequestLine 8190 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
此指令设置 HTTP 请求行允许的 bytes 数。
使用 LimitRequestLine
指令,服务器管理员可以设置限制,以限制客户端 HTTP 请求行允许的大小。由于请求行包含 HTTP 方法、URI 和协议版本,因此 LimitRequestLine
指令对服务器上请求允许的请求 URI 的长度施加限制。服务器需要此值足够大,以容纳其任何资源名称,包括在 GET
请求的查询部分中可能传递的任何信息。
此指令使服务器管理员能够更好地控制异常的客户端请求行为,这对于避免某些形式的拒绝服务攻击可能很有用。
例如
LimitRequestLine 4094
当使用基于名称的虚拟主机时,此指令的值取自与当前 IP 地址和端口组合最匹配的默认(首选)虚拟主机。
描述 | 限制基于 XML 的请求正文的大小 |
---|---|
语法 | LimitXMLRequestBody bytes |
默认 | LimitXMLRequestBody 1000000 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
基于 XML 的请求正文的最大大小的限制(以字节为单位)。值为 0
将应用硬限制(取决于 32 位与 64 位系统),允许在系统可寻址内存的范围内进行 XML 转义,但它仅出于兼容性而存在,不建议使用,因为它不考虑在其他地方或并发请求中消耗的内存,这可能会导致整个系统内存不足。
示例
# Limit of 1 MiB LimitXMLRequestBody 1073741824
描述 | 仅将所附指令应用于匹配的 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
,则它将匹配。
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
,则它将匹配。
描述 | 控制 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
时,也会发布日志级别为 notice
和 warn
的消息。
建议使用至少 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>
描述 | 持久连接上允许的请求数 |
---|---|
语法 | MaxKeepAliveRequests 数字 |
默认 | MaxKeepAliveRequests 100 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
当 KeepAlive
处于启用状态时,MaxKeepAliveRequests
指令限制每个连接允许的请求数。如果将其设置为 0
,则允许无限请求。我们建议将此设置保持在较高值,以获得最大的服务器性能。
例如
MaxKeepAliveRequests 500
描述 | 允许的重叠范围数(例如:100-200,150-300 ),在返回完整资源之前 |
---|---|
语法 | MaxRangeOverlaps 默认值 | 无限制 | 无 | 范围数 |
默认 | MaxRangeOverlaps 20 |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 适用于 Apache HTTP Server 2.3.15 及更高版本 |
MaxRangeOverlaps
指令限制服务器愿意返回给客户端的重叠 HTTP 范围数。如果请求的重叠范围数超过允许范围,则会返回完整资源。
描述 | 允许的范围反转数(例如:100-200,50-70 ),在返回完整资源之前 |
---|---|
语法 | MaxRangeReversals 默认值 | 无限制 | 无 | 范围数 |
默认 | MaxRangeReversals 20 |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 适用于 Apache HTTP Server 2.3.15 及更高版本 |
MaxRangeReversals
指令限制服务器愿意返回给客户端的 HTTP 范围反转数。如果请求的范围反转数超过允许范围,则会返回完整资源。
描述 | 允许的范围数,在返回完整资源之前 |
---|---|
语法 | MaxRanges 默认值 | 无限制 | 无 | 范围数 |
默认 | MaxRanges 200 |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 适用于 Apache HTTP Server 2.3.15 及更高版本 |
MaxRanges
指令限制服务器愿意返回给客户端的 HTTP 范围数。如果请求的范围数超过允许范围,则会返回完整资源。
描述 | 控制服务器是否合并 URL 中连续的斜杠。 |
---|---|
语法 | MergeSlashes ON|OFF |
默认 | MergeSlashes ON |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.4.39 中添加 |
默认情况下,服务器合并(或折叠)请求 URL 路径组件中的多个连续斜杠('/')字符。
在将 URL 映射到文件系统时,这些多个斜杠并不重要。但是,通过 CGI 或代理等其他方式处理的 URL 可能更愿意保留多个连续斜杠的意义。在这些情况下,可以将 MergeSlashes
设置为 OFF 以保留多个连续斜杠,这是传统行为。
当设置为“OFF”时,配置文件中用于匹配 URL 路径组件的正则表达式(LocationMatch
、RewriteRule
等)需要考虑多个连续斜杠。基于非正则表达式的 Location
始终针对合并斜杠的 URL 运行,并且无法区分多个斜杠。
描述 | 确定是否将拖尾合并到标头中 |
---|---|
语法 | MergeTrailers [on|off] |
默认 | MergeTrailers off |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 2.4.11 及更高版本 |
此指令控制是否将 HTTP 拖尾复制到 HTTP 标头的内部表示中。此合并发生在请求正文完全使用后,在大多数标头处理有机会检查或修改请求标头之后很长时间。
提供此选项是为了与 2.4.11 之前的版本兼容,在这些版本中始终合并拖尾。
描述 | 为所有或指定的互斥锁配置互斥锁机制和锁定文件目录 |
---|---|
语法 | Mutex mechanism [default|mutex-name] ... [OmitPID] |
默认 | Mutex default |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 适用于 Apache HTTP Server 2.3.4 及更高版本 |
Mutex
指令设置 httpd 和模块用于序列化对资源的访问的机制,还可以设置锁定文件位置。将 default
指定为第二个参数以更改所有互斥锁的设置;将互斥锁名称(见下表)指定为第二个参数以仅覆盖该互斥锁的默认值。
Mutex
指令通常用于以下特殊情况
此指令仅配置已使用 ap_mutex_register()
API 向核心服务器注册的互斥锁。与 httpd 捆绑的所有模块都支持 Mutex
指令,但第三方模块可能不支持。查阅第三方模块的文档,该文档必须指出如果支持此指令,可以配置哪些互斥锁名称。
以下互斥锁机制可用
default | yes
none | no
这将有效禁用互斥锁,并且仅允许在模块指示其为有效选择时用于互斥锁。有关更多信息,请查阅模块文档。
posixsem
这是一个基于 Posix 信号量的互斥锁变体。
如果持有互斥锁的进程中的线程段错误,则不会恢复信号量所有权,从而导致 Web 服务器挂起。
sysvsem
这是一个基于 SystemV IPC 信号量的互斥锁变体。
如果进程在删除信号量之前崩溃,则可能会“泄漏”SysV 信号量。
信号量 API 允许任何在与 Web 服务器相同的 uid 下运行的 CGI 执行拒绝服务攻击(即,所有 CGI,除非您使用 suexec
或 cgiwrapper
之类的工具)。
sem
这会选择“最佳”可用信号量实现,按顺序在 Posix 和 SystemV IPC 信号量之间进行选择。
pthread
这是一个基于跨进程 Posix 线程互斥锁的互斥锁变体。
在大多数系统上,如果子进程在持有使用此实现的互斥锁时异常终止,服务器将死锁并停止响应请求。发生这种情况时,服务器将需要手动重启才能恢复。
Solaris 和 Linux 是值得注意的例外,因为它们提供了一种机制,通常允许在子进程在持有互斥锁时异常终止后恢复互斥锁。
如果您的系统符合 POSIX 标准或如果它实现了 pthread_mutexattr_setrobust_np()
函数,您可能可以安全地使用 pthread
选项。
fcntl:/path/to/mutex
这是一个互斥锁变体,其中物理(锁定)文件和 fcntl()
函数用作互斥锁。
如果在多线程、多进程环境中使用基于此机制的多个互斥锁,如果 fcntl()
不支持线程(例如在 Solaris 上),则可能会针对有效的互斥锁操作报告死锁错误 (EDEADLK)。
flock:/path/to/mutex
这与 fcntl:/path/to/mutex
方法类似,但例外情况是使用 flock()
函数提供文件锁定。
file:/path/to/mutex
这会选择“最佳”可用文件锁定实现,按顺序在 fcntl
和 flock
之间进行选择。
大多数机制仅在选定的平台上可用,其中基础平台和 APR 支持它。在所有平台上都不可用的机制包括 posixsem、sysvsem、sem、pthread、fcntl、flock 和 file。
对于基于文件的机制 fcntl 和 flock,如果提供了路径,则该路径是将创建锁定文件的目录。默认目录是相对于 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 |
prefork 和 worker 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
描述 | 已弃用:指定名称虚拟主机的 IP 地址 |
---|---|
语法 | NameVirtualHost addr[:port] |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
在 2.3.11 之前,需要 NameVirtualHost
指示服务器某个特定 IP 地址和端口组合可用作基于名称的虚拟主机。在 2.3.11 及更高版本中,任何时候在多个虚拟主机中使用 IP 地址和端口组合,都会自动为该地址启用基于名称的虚拟主机。
此指令当前没有任何效果。
描述 | 配置特定目录中可用的功能 |
---|---|
语法 | Options [+|-]option [[+|-]option] ... |
默认 | Options FollowSymlinks |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 选项 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 默认值已在 2.3.11 中从 All 更改为 FollowSymlinks |
Options
指令控制特定目录中可用的服务器功能。
option 可以设置为 None
,在这种情况下,不会启用任何额外功能,或以下一项或多项
全部
MultiViews
之外的所有选项。ExecCGI
mod_cgi
执行 CGI 脚本。FollowSymLinks
即使服务器遵循符号链接,它也不会更改用于与 <Directory>
部分匹配的路径名。
FollowSymLinks
和 SymLinksIfOwnerMatch
Options
仅在 <Directory>
部分或 .htaccess
文件中起作用。
不选择此选项不应被视为安全限制,因为符号链接测试会受到竞态条件的影响,这会使其可被规避。
Includes
mod_include
提供的服务器端包含。IncludesNOEXEC
#exec cmd
和 #exec cgi
。仍然可以从 ScriptAlias
ed 目录中#include virtual
CGI 脚本。索引
DirectoryIndex
(例如,index.html
),那么 mod_autoindex
将返回该目录的格式化列表。MultiViews
mod_negotiation
允许“MultiViews”进行 内容协商。如果在 <Directory>
之外的任何地方设置此选项,则此选项将被忽略,因为 mod_negotiation
需要比较和评估的真实资源。
SymLinksIfOwnerMatch
FollowSymLinks
和 SymLinksIfOwnerMatch
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>
那么 FollowSymLinks
和 Includes
选项会为 /web/docs/spec
目录设置。
使用 -IncludesNOEXEC
或 -Includes
会完全禁用服务器端包含,而不管之前的设置如何。
在没有其他设置的情况下,默认值为 FollowSymlinks
。
描述 | 用于侦听套接字的协议 |
---|---|
语法 | Protocol protocol |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 Apache 2.1.5 及更高版本中可用。在 Windows 上,从 Apache 2.3.3 及更高版本可用。 |
此指令指定用于特定侦听套接字的协议。协议用于确定哪个模块应处理请求,并使用 AcceptFilter
指令应用特定于协议的优化。
大多数配置不需要此指令。如果未指定,则端口 443 的默认值为 https
,所有其他端口的默认值为 http
。协议用于确定哪个模块应处理请求,并使用 AcceptFilter
指令应用特定于协议的优化。
例如,如果你在非标准端口上运行 https
,请明确指定协议
Protocol https
你还可以使用 Listen
指令指定协议。
描述 | 服务器/虚拟主机的可用协议 |
---|---|
语法 | 协议 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 指令将替换基本服务器中的任何此类指令。
描述 | 确定 Protocols 的顺序是否决定协商期间的优先级 |
---|---|
语法 | ProtocolsHonorOrder On|Off |
默认 | ProtocolsHonorOrder On |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 仅在 Apache 2.4.17 及更高版本中可用。 |
此指令指定服务器是否应遵循 Protocols
指令列出协议的顺序。
如果配置为 Off,则客户端提供的协议列表顺序优先于服务器配置中的顺序。
将 ProtocolsHonorOrder
设置为 on
(默认值)时,客户端排序无关紧要,只有服务器设置中的排序才会影响协议协商的结果。
描述 | 控制 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 仍将保持完全限定。
描述 | 用于读取数据的缓冲区大小 |
---|---|
语法 | ReadBufferSize bytes |
默认 | ReadBufferSize 8192 |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 2.4.27 及更高版本 |
此指令允许配置用于从网络或文件中读取数据时使用的内存缓冲区的大小(以字节为单位)。
较大的缓冲区可以提高处理较大数据时的性能,但会消耗每个连接更多的内存。可配置的最小大小为 1024。
描述 | 允许为正则表达式配置全局/默认选项 |
---|---|
语法 | RegexDefaultOptions [none] [+|-]选项 [[+|-]选项] ... |
默认 | RegexDefaultOptions DOTALL DOLLAR_ENDONLY |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 仅适用于 Apache 2.4.30 及更高版本。 |
此指令为随后使用的任何正则表达式添加一些默认行为。
任何带有“+”前缀的选项都会添加到已设置的选项中。
任何带有“-”前缀的选项都会从已设置的选项中移除。
任何没有“+”或“-”的选项都会被设置,移除任何其他已设置的选项。none
关键字会重置任何已设置的选项。
选项 可以是
ICASE
EXTENDED
DOTALL
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 ...
描述 | 注册非标准 HTTP 方法 |
---|---|
语法 | RegisterHttpMethod 方法 [方法 [...]] |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 适用于 Apache HTTP Server 2.4.24 及更高版本 |
此指令可用于注册其他 HTTP 方法。如果需要将非标准方法与接受方法名称作为参数的指令一起使用,或者当服务器配置为仅向模块传递已识别的方法时,允许通过代理或 CGI 脚本使用特定的非标准方法,则需要这样做。
描述 | 限制 Apache httpd 子进程启动的进程的 CPU 消耗 |
---|---|
语法 | RLimitCPU 秒数|max [秒数|max] |
默认 | 未设置;使用操作系统默认值 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
采用 1 个或 2 个参数。第一个参数为所有进程设置软资源限制,第二个参数设置最大资源限制。任一参数都可以是数字,也可以是 max
,向服务器指示应将限制设置为操作系统配置允许的最大值。提高最大资源限制要求服务器以 root
身份或在初始启动阶段运行。
这适用于从 Apache httpd 子进程派生的处理请求的进程,而不是 Apache httpd 子进程本身。这包括 CGI 脚本和 SSI exec 命令,但不包括从 Apache httpd 父进程派生的任何进程,例如管道日志。
CPU 资源限制以每个进程的秒数表示。
描述 | 限制 Apache httpd 子进程启动的进程的内存消耗 |
---|---|
语法 | RLimitMEM 字节|max [字节|max] |
默认 | 未设置;使用操作系统默认值 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
采用 1 个或 2 个参数。第一个参数为所有进程设置软资源限制,第二个参数设置最大资源限制。任一参数都可以是数字,也可以是 max
,向服务器指示应将限制设置为操作系统配置允许的最大值。提高最大资源限制要求服务器以 root
身份或在初始启动阶段运行。
这适用于从 Apache httpd 子进程派生的处理请求的进程,而不是 Apache httpd 子进程本身。这包括 CGI 脚本和 SSI exec 命令,但不包括从 Apache httpd 父进程派生的任何进程,例如管道日志。
内存资源限制以每个进程的字节数表示。
描述 | 限制 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
消息将表明此情况的证据。
描述 | 用于查找 CGI 脚本解释器的技术 |
---|---|
语法 | ScriptInterpreterSource Registry|Registry-Strict|Script |
默认 | ScriptInterpreterSource Script |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
兼容性 | 仅适用于 Win32。 |
此指令用于控制 Apache httpd 如何查找用于运行 CGI 脚本的解释器。默认设置为 Script
。这将导致 Apache httpd 使用脚本中 shebang 行(第一行,以 #!
开头)指向的解释器。在 Win32 系统上,此行通常看起来像
#!C:/Perl/bin/perl.exe
或者,如果 perl
在 PATH
中,则只需
#!perl
设置 ScriptInterpreterSource Registry
将导致使用脚本文件扩展名(例如,.pl
)作为搜索键来搜索 Windows 注册表树 HKEY_CLASSES_ROOT
。使用注册表子键 Shell\ExecCGI\Command
定义的命令,或者如果不存在,则使用子键 Shell\Open\Command
来打开脚本文件。如果找不到注册表键,Apache httpd 将回退到 Script
选项的行为。
使用 ScriptInterpreterSource Registry
与 ScriptAlias
'ed 目录时要小心,因为 Apache httpd 将尝试执行此目录中的每个文件。Registry
设置可能会导致对通常不执行的文件进行意外的程序调用。例如,大多数 Windows 系统上 .htm
文件的默认打开命令将执行 Microsoft Internet Explorer,因此对脚本目录中存在的 .htm
文件的任何 HTTP 请求都会在服务器上后台启动浏览器。这是在大约一分钟内使系统崩溃的好方法。
选项 Registry-Strict
执行与 Registry
相同的操作,但仅使用子键 Shell\ExecCGI\Command
。ExecCGI
键并不常见。它必须在 Windows 注册表中手动配置,因此可以防止在系统上意外调用程序。
描述 | 确定 mod_status 显示请求的前 63 个字符还是后 63 个字符,假设请求本身大于 63 个字符。 |
---|---|
语法 | SeeRequestTail On|Off |
默认 | SeeRequestTail Off |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 适用于 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(默认) | GET /disk1/storage/apache/htdocs/images/imagestore1/food/apples |
---|---|
On | orage/apache/htdocs/images/imagestore1/food/apples.jpg HTTP/1.1 |
描述 | 服务器在发送给客户端的错误消息中包含的电子邮件地址 |
---|---|
语法 | ServerAdmin email-address|URL |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
ServerAdmin
设置服务器在返回给客户端的任何错误消息中包含的联系地址。如果 httpd
未将提供的参数识别为 URL,它将假定该参数是 email-address,并在超链接目标中用 mailto:
为其添加前缀。但是,建议实际使用电子邮件地址,因为有很多 CGI 脚本会做出这样的假设。如果你想使用 URL,它应该指向你控制下的另一个服务器。否则,用户在出现错误时可能无法联系到你。
为此设置一个专用地址可能是值得的,例如
ServerAdmin [email protected]
因为用户并不总是提到他们正在谈论服务器!
描述 | 在将请求与基于名称的虚拟主机匹配时用于主机的备用名称 |
---|---|
语法 | ServerAlias hostname [hostname] ... |
上下文 | 虚拟主机 |
状态 | 核心 |
模块 | 核心 |
ServerAlias
指令为主机设置备用名称,以用于 基于名称的虚拟主机。如果合适,ServerAlias
可以包含通配符。
<VirtualHost *:80> ServerName server.example.com ServerAlias server server2.example.com server2 ServerAlias *.example.com UseCanonicalName Off # ... </VirtualHost>
针对最匹配的 <virtualhost>
集的基于名称的虚拟主机将按其在配置中出现的顺序进行处理。将使用第一个匹配的 ServerName
或 ServerAlias
,而通配符(或 ServerName 与 ServerAlias)没有不同的优先级。
<VirtualHost>
指令中的完整名称列表被视为一个(非通配符)ServerAlias
。
描述 | 服务器用于标识自己的主机名和端口 |
---|---|
语法 | 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。
请参阅UseCanonicalName
和UseCanonicalPhysicalPort
指令的说明,了解确定自引用 URL(例如,mod_dir
模块)将引用指定端口还是客户端请求中给出的端口号的设置。
如果未将ServerName
设置为服务器可以解析为 IP 地址的名称,则会导致启动警告。然后,httpd
将使用它可以确定的任何主机名,使用系统的hostname
命令。这几乎永远不是您实际想要的主机名。
httpd:无法可靠地确定服务器的完全限定域名,使用 rocinante.local 作为 ServerName
描述 | 由不兼容的浏览器访问的基于名称的虚拟主机的旧版 URL 路径名 |
---|---|
语法 | ServerPath URL-path |
上下文 | 虚拟主机 |
状态 | 核心 |
模块 | 核心 |
ServerPath
指令为主机设置旧版 URL 路径名,以与基于名称的虚拟主机一起使用。
描述 | 服务器安装的基本目录 |
---|---|
语法 | ServerRoot directory-path |
默认 | ServerRoot /usr/local/apache |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
ServerRoot
指令设置服务器所在的目录。通常它将包含子目录conf/
和logs/
。其他配置指令中的相对路径(例如Include
或LoadModule
)被视为相对于此目录的相对路径。
ServerRoot "/home/httpd"
可以使用--prefix
参数修改ServerRoot
的默认位置以configure
,并且大多数服务器的第三方发行版的默认位置与上面列出的位置不同。
-d
选项到httpd
ServerRoot
的权限描述 | 配置服务器生成文档上的页脚 |
---|---|
语法 | ServerSignature On|Off|EMail |
默认 | ServerSignature Off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | 全部 |
状态 | 核心 |
模块 | 核心 |
ServerSignature
指令允许配置服务器生成文档(错误消息、mod_proxy
ftp 目录列表、mod_info
输出,...)下的尾部行。您希望启用此类尾部行的原因是,在代理链中,用户通常无法判断哪个链式服务器实际生成了返回的错误消息。
Off
设置(默认设置)会禁止尾部行。On
设置只会添加一行,其中包含服务器版本号和提供服务的虚拟主机的ServerName
,而EMail
设置还会创建对引用的文档的ServerAdmin
的“mailto:”引用。
显示的服务器版本号的详细信息由 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: 头并不能让服务器更安全。通过模糊来实现“安全”的想法是一种误解,会导致一种虚假的安全感。描述 | 强制所有匹配文件由处理程序处理 |
---|---|
语法 | 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 作为目录或索引文件进行处理。
描述 | 设置将处理客户端请求和 POST 输入的过滤器 |
---|---|
语法 | SetInputFilter filter[;filter...] |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
SetInputFilter
指令设置在服务器收到客户端请求和 POST 输入时将处理这些请求和输入的过滤器。这将添加到在其他地方定义的任何过滤器中,包括 AddInputFilter
指令。
如果指定了多个过滤器,则必须按它们处理内容的顺序用分号分隔这些过滤器。
描述 | 设置将处理服务器响应的过滤器 |
---|---|
语法 | SetOutputFilter filter[;filter...] |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 核心 |
模块 | 核心 |
SetOutputFilter
指令设置在将服务器响应发送到客户端之前将处理这些响应的过滤器。这将添加到在其他地方定义的任何过滤器中,包括 AddOutputFilter
指令。
例如,以下配置将处理 /www/data/
目录中的所有文件以进行服务器端包含。
<Directory "/www/data/"> SetOutputFilter INCLUDES </Directory>
如果指定了多个过滤器,则必须按它们处理内容的顺序用分号分隔这些过滤器。
描述 | 控制服务器是否要求请求的主机名列在处理请求的虚拟主机中 |
---|---|
语法 | StrictHostCheck ON|OFF |
默认 | StrictHostCheck OFF |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.4.49 中添加 |
默认情况下,服务器将响应任何主机名的请求,包括发送到意外或未配置主机名的请求。虽然这很方便,但有时需要限制后端应用程序处理的主机名,因为它通常会生成自引用响应。
通过将 StrictHostCheck
设置为 ON,如果请求的主机名尚未在与传入连接的详细信息最匹配的虚拟主机中通过 ServerName
或 ServerAlias
明确列出,则服务器将返回 HTTP 400 错误。
此指令还允许将请求的主机名与在打开的 VirtualHost
标记中指定的主机名进行匹配,这是一种相对模糊的配置机制,其作用类似于其他 ServerAlias
条目。
此指令在非默认虚拟主机中不起作用。从全局服务器配置或底层连接的 ip:port 继承的值确定有效值。
描述 | 服务器在请求失败之前等待某些事件的时间量 |
---|---|
语法 | TimeOut seconds |
默认 | TimeOut 60 |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
TimeOut
指令定义 Apache httpd 在各种情况下等待 I/O 的时间长度
在从客户端读取数据时,如果读取缓冲区为空,则等待 TCP 数据包到达的时间长度。
对于新连接上的初始数据,此指令在任何已配置的 AcceptFilter
将新连接传递给服务器之后才生效。
mod_cgi
和 mod_cgid
中,等待 CGI 脚本中任何单个输出块的时间长度。mod_ext_filter
中,等待过滤进程输出的时间长度。mod_proxy
中,如果未配置 ProxyTimeout
,则为默认超时值。描述 | 确定对 TRACE 请求的行为 |
---|---|
语法 | TraceEnable [on|off|extended] |
默认 | TraceEnable on |
上下文 | 服务器配置、虚拟主机 |
状态 | 核心 |
模块 | 核心 |
此指令会覆盖核心服务器和 mod_proxy
中 TRACE
的行为。默认的 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 规范定义,并且预计实现会支持它。
描述 | 控制服务器可以访问哪些 UNC 主机名 |
---|---|
语法 | UNCList hostname [hostname...] |
默认 | unset |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
兼容性 | 在 2.4.60 中添加,仅适用于 Windows。 |
在请求处理过程中,对解析为 UNC 路径的文件系统路径的访问请求会失败,除非 UNC 路径中的主机名已由该指令指定。目的是限制对源自不受信任输入的路径的访问。
UNCList example.com other.example.com
在请求处理之外访问的 UNC 路径(例如在启动期间)不一定根据此指令配置的主机名进行检查。
此指令应放在 httpd.conf 中使用的 UNC 路径之前。多次出现该指令会重置列表。
描述 | 取消定义变量的存在 |
---|---|
语法 | UnDefine parameter-name |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
撤消 Define
的效果或将 -D
参数传递给 httpd
的效果。
此指令可用于切换 <IfDefine>
部分的使用,而无需更改任何启动脚本中的 -D
参数。
变量名称不能包含冒号 “:” 字符,以避免与 RewriteMap
的语法冲突。
虽然此指令在虚拟主机上下文中受支持,但它所做的更改对任何后续配置指令都是可见的,超出了任何封闭的虚拟主机。
描述 | 配置服务器如何确定自己的名称和端口 |
---|---|
语法 | UseCanonicalName On|Off|DNS |
默认 | UseCanonicalName Off |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
在许多情况下,Apache httpd 必须构建一个自引用 URL -- 即一个引用回同一服务器的 URL。使用 UseCanonicalName On
时,Apache httpd 将使用 ServerName
指令中指定的主机名和端口来构建服务器的规范名称。此名称用于所有自引用 URL,以及 CGI 中 SERVER_NAME
和 SERVER_PORT
的值。
使用 UseCanonicalName Off
时,Apache httpd 将使用客户端提供的(如果提供了)主机名和端口来形成自引用 URL(否则将使用规范名称,如上所述)。这些值与用于实现 基于名称的虚拟主机 的值相同,并且可供相同的客户端使用。CGI 变量 SERVER_NAME
和 SERVER_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,则应该没问题。
描述 | 配置服务器如何确定其自己的端口 |
---|---|
语法 | UseCanonicalPhysicalPort On|Off |
默认 | UseCanonicalPhysicalPort Off |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 核心 |
模块 | 核心 |
在许多情况下,Apache httpd 必须构造一个自引用 URL——即一个引用回同一服务器的 URL。当 UseCanonicalPhysicalPort On
时,Apache httpd 在为服务器构造规范端口以遵守 UseCanonicalName
指令时,会提供此请求使用的实际物理端口号作为潜在端口。当 UseCanonicalPhysicalPort Off
时,Apache httpd 永远不会使用实际物理端口号,而是依赖所有已配置的信息来构造有效的端口号。
使用物理端口时的查找顺序如下
UseCanonicalName On
Servername
中提供的端口UseCanonicalName Off | DNS
Host:
标头中解析的端口Servername
中提供的端口对于 UseCanonicalPhysicalPort Off
,物理端口已从顺序中移除。
描述 | 包含仅适用于特定主机名或 IP 地址的指令 |
---|---|
语法 | <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> |
上下文 | 服务器配置 |
状态 | 核心 |
模块 | 核心 |
<VirtualHost>
和 </VirtualHost>
用于包含仅适用于特定虚拟主机的指令组。可以使用虚拟主机上下文中允许的任何指令。当服务器收到对特定虚拟主机上文档的请求时,它会使用 <VirtualHost>
部分中包含的配置指令。Addr 可以是以下任何一项,后面可以跟一个冒号和一个端口号(或 *)
*
,它充当通配符,并匹配任何 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
命令来实现此目的——如果您的操作系统支持的话)。
使用 <VirtualHost>
不会影响 Apache httpd 侦听的地址。您可能需要使用 Listen
确保 Apache httpd 侦听正确的地址。
应在每个 <VirtualHost>
块内指定 ServerName
。如果它不存在,将继承“主”服务器配置中的 ServerName
。
收到请求时,服务器首先根据本地 IP 地址和端口组合将其映射到最佳匹配的 <VirtualHost>
。非通配符具有更高的优先级。如果根本没有基于 IP 和端口的匹配,则使用“主”服务器配置。
如果多个虚拟主机包含最佳匹配的 IP 地址和端口,则服务器将从这些虚拟主机中根据请求的主机名选择最佳匹配。如果没有找到基于名称的匹配虚拟主机,则将使用与 IP 地址匹配的第一个列出的虚拟主机。因此,对于给定的 IP 地址和端口组合,第一个列出的虚拟主机是该 IP 和端口组合的默认虚拟主机。
请参阅 安全提示 文档,了解如果存储日志文件的目录可被除启动服务器的用户之外的任何人写入,您的安全为何可能受到损害的详细信息。