Apache HTTP Server 版本2.2
AcceptFilter 指令
说明 | 根据协议类型对监听Socket进行优化 |
---|---|
语法 | AcceptFilter protocol accept_filter |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 2.1.5 以后的版本中可用 |
这个指令使得操作系统根据协议类型对监听socket进行特别的优化。其基本前提是内核在数据接受完毕或一个完整的HTTP请求缓冲完成前不向服务器进程发送socket 。目前仅支持FreeBSD的接收过滤器(Accept Filter)和Linux的更原始的(more primitive)TCP_DEFER_ACCEPT
。
FreeBSD上的默认值是:
AcceptFilter http httpready
AcceptFilter https dataready
httpready
接收过滤器(Accept Filter)在内核级别缓冲整个HTTP请求。一旦一个请求体被完整接收,内核将把它发送给服务器。参见accf_http(9)手册页以获得更详细的信息。因为HTTPS请求已经被加密了,所以只使用了accf_data(9)过滤器。
Linux上的默认值是:
AcceptFilter http data
AcceptFilter https data
Linux的TCP_DEFER_ACCEPT
并不支持对http请求进行缓冲。除none
之外的任何值都将在监听程序上启用TCP_DEFER_ACCEPT
。参见tcp(7)手册页以获得更多详情。
使用none
将会为那个协议禁用接收过滤器(accept filter)。这对于像nntp
这样需要服务器先发送数据的协议很有用处:
AcceptFilter nttp none
AcceptPathInfo 指令
说明 | 是否接受附带多余路径名信息的请求 |
---|---|
语法 | AcceptPathInfo On|Off|Default |
默认值 | AcceptPathInfo Default |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 2.0.30 及以后的版本中可用 |
此指令决定是否接受在实际文件名(或实际目录中一个不存在的文件)后跟随多余路径名信息的请求。这个多余的路径名信息可以当作PATH_INFO
环境变量传递给脚本。
比如说,假设/test/
所指向的目录下只包括一个文件:here.html
,那么对/test/here.html/more
和/test/nothere.html/more
的请求都会将PATH_INFO
环境变量设为"/more
"。
AcceptPathInfo
指令的取值范围:
Off
- 仅当一个请求映射到一个真实存在的路径时,才会被接受。这样,如上述
/test/here.html/more
这样在真实文件名后跟随一个路径名的请求将会返回一个"404 NOT FOUND"错误。 On
- 只要前导路径可以映射到一个真实存在的文件,就可以接受该请求。这样,只要上述
/test/here.html
能够映射到一个有效的文件,那么对/test/here.html/more
的请求就会被接收。 Default
- 是否接收附带多余路径名信息的请求由其对应的处理器来决定。对应普通文本的核心处理器默认会拒绝
PATH_INFO
。而用于伺服脚本的处理器,比如cgi-script和isapi-isa,默认会接受PATH_INFO
。
AcceptPathInfo
指令存在的首要目的就是允许您覆盖处理器关于是否接受PATH_INFO
的默认设置。这种覆盖是很必要的。比如说,当您使用了类似INCLUDES这样的过滤器来根据PATH_INFO
产生内容时。核心处理器通常会拒绝这样的请求,而您就可以用下述的配置使这样的脚本成为可能:
<Files "mypaths.shtml">
Options +Includes
SetOutputFilter INCLUDES
AcceptPathInfo On
</Files>
AccessFileName 指令
说明 | 分布式配置文件的名字 |
---|---|
语法 | AccessFileName filename |
默认值 | AccessFileName .htaccess |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
如果为某个目录启用了分布式配置文件功能,那么在向客户端返回其中的文档时,服务器将在这个文档所在的各级目录中查找此配置文件。比如:
AccessFileName .acl
在返回文档/usr/local/web/index.html
之前,服务器会为此指令读取 /.acl
、/usr/.acl
、/usr/local/.acl
、/usr/local/web/.acl
除非此功能以被如下配置所禁用:
<Directory />
AllowOverride None
</Directory>
参见
AddDefaultCharset 指令
说明 | 当应答内容是text/plain 或text/html 时,在HTTP应答头中加入的默认字符集 |
---|---|
语法 | AddDefaultCharset On|Off|charset |
默认值 | AddDefaultCharset Off |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
当且仅当应答内容是text/plain
或text/html
时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过<meta>
标签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off
将会禁用此功能。AddDefaultCharset On
将启用Apache内部的默认字符集iso-8859-1
。您也可以指定使用在IANA注册过的字符集名字中的另外一个charset 。比如说:
AddDefaultCharset utf-8
AddDefaultCharset
只应当在如下情况下使用:所有文本资源都使用同一种确定的字符集,且分别标记他们的字符集非常麻烦。一个这样的例子是向包含动态内容的资源中添加字符集参数(比如先前遗留的CGI脚本),这样可能会因为在输出中包含用户提供的数据而导致跨站点脚本攻击。但是请注意:更好的解决办法是修改或删除这些脚本,因为设置了默认的字符集以后将会使得浏览器的字符集自动探测功能失效。
参见
AddOutputFilterByType 指令
说明 | 对特定的MIME类型指定输出过滤器 |
---|---|
语法 | AddOutputFilterByType filter[;filter...] MIME-type [MIME-type] ... |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | Apache 2.0.33 以后可用,但在Apache 2.1 以后反对使用 |
此指令根据应答的MIME类型对请求激活特定的输出过滤器。由于下面将要讨论的问题,我们反对使用这个指令。同样的功能可以通过使用mod_filter
模块获得。
下例使用了由mod_deflate
提供的DEFLATE
过滤器。它将把所有以text/html
或text/plain
为标记的输出(不论静态或动态)在发送到客户端之前进行压缩。
AddOutputFilterByType DEFLATE text/html text/plain
如果您希望使用多个过滤器来处理内容,您可以用分号(;)来分隔它们的名字。并对每个过滤器使用AddOutputFilterByType
指令。
下述配置将使所有标记为text/html
的脚本输出首先被INCLUDES
过滤器处理后再被DEFLATE
过滤器处理。
<Location /cgi-bin/>
Options Includes
AddOutputFilterByType INCLUDES;DEFLATE text/html
</Location>
注意
在某些情况下,用AddOutputFilterByType
来使用过滤器会遭受部分或完全的失败。比如,如果MIME类型不能确定,那么将不会有过滤器加于其上,从而使之回到DefaultType
的设置。甚至当DefaultType
与其相同的时候也是这样。
然而,如果您想确认对某些资源相关的内容类型确实使用了过滤器,您可以使用用诸如AddType
或ForceType
这样的办法。在一个(non-nph)CGI脚本中设定内容类型也很安全。
由类型决定的输出过滤器永远不会作用于来自代理的请求。
参见
AllowEncodedSlashes 指令
说明 | 确定是否允许URL中使用经过编码的路径分割符 |
---|---|
语法 | AllowEncodedSlashes On|Off |
默认值 | AllowEncodedSlashes Off |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 2.0.46 及以后的版本中可用 |
AllowEncodedSlashes
指令允许使用包含经过编码的路径分割符的URL("%2F
"→"/
"或"%5C
"→"\
",取决于不同的系统)。默认情况下,这些URL将被一个包含"404"(未找到)错误的应答拒绝。
AllowEncodedSlashes
On
通常和PATH_INFO
配合使用。
注意
允许使用经过编码的斜线(路径分割符)并不意味着解码。%2F
或%5C
(仅仅取决于不同的系统)将会按原样出现在解码后的URL字符串中。
参见
AllowOverride 指令
说明 | 确定允许存在于.htaccess 文件中的指令类型 |
---|---|
语法 | AllowOverride All|None|directive-type
[directive-type] ... |
默认值 | AllowOverride All |
作用域 | directory |
状态 | 核心(C) |
模块 | core |
当服务器发现一个.htaccess
文件(由AccessFileName
指定)时,它需要知道在这个文件中声明的哪些指令能覆盖在此之前指定的配置指令。
仅允许存在于<Directory>配置段
AllowOverride
仅在不包含正则表达式的<Directory>
配置段中才是有效的。在<Location>
, <DirectoryMatch>
, <Files>
配置段中都是无效的。如果此指令被设置为None
,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess
文件。
当此指令设置为 All
时,所有具有".htaccess"作用域的指令都允许出现在.htaccess
文件中。
directive-type可以是下列各组指令之一:
- AuthConfig
- 允许使用与认证授权相关的指令(
AuthDBMGroupFile
,AuthDBMUserFile
,AuthGroupFile
,AuthName
,AuthType
,AuthUserFile
,Require
, 等)。 - FileInfo
- 允许使用控制文档类型的指令(
DefaultType
,ErrorDocument
,ForceType
,LanguagePriority
,SetHandler
,SetInputFilter
,SetOutputFilter
,mod_mime
中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header
,RequestHeader
,SetEnvIf
,SetEnvIfNoCase
,BrowserMatch
,CookieExpires
,CookieDomain
,CookieStyle
,CookieTracking
,CookieName
)、mod_rewrite
中的指令(RewriteEngine
,RewriteOptions
,RewriteBase
,RewriteCond
,RewriteRule
)和mod_actions
中的Action
指令。 - Indexes
- 允许使用控制目录索引的指令(
AddDescription
,AddIcon
,AddIconByEncoding
,AddIconByType
,DefaultIcon
,DirectoryIndex
,FancyIndexing
,HeaderName
,IndexIgnore
,IndexOptions
,ReadmeName
, 等)。 - Limit
- 允许使用控制主机访问的指令(
Allow
,Deny
,Order
)。 - Options[=Option,...]
- 允许使用控制指定目录功能的指令(
Options
和XBitHack
)。可以在等号后面附加一个逗号分隔的(无空格的)Options
选项列表,用来控制允许Options
指令使用哪些选项。
例如以下指令只允许在.htaccess
中使用AuthConfig
和Indexes
组的指令:
AllowOverride AuthConfig Indexes
不在这两组中的指令将会导致服务器产生一个内部错误。
参见
AuthName 指令
说明 | 用于HTTP认证的授权域 |
---|---|
语法 | AuthName auth-domain |
作用域 | directory, .htaccess |
覆盖项 | AuthConfig |
状态 | 核心(C) |
模块 | core |
此指令为目录的授权域设置名字。此域将发送给客户端以使用户了解应当发送哪个用户名和密码。AuthName
指令带有一个参数。如果域的名字中包含空格,则必须用引号引起来。它必须与AuthType
和Require
指令以及诸如AuthUserFile
和AuthGroupFile
这样的指令一起工作。
例如:
AuthName "Top Secret"
提供给AuthName
的字符串将出现在大多数浏览器提供的密码对话框中。
参见
AuthType 指令
说明 | 用户认证类型 |
---|---|
语法 | AuthType Basic|Digest |
作用域 | directory, .htaccess |
覆盖项 | AuthConfig |
状态 | 核心(C) |
模块 | core |
此指令选择了一个目录的用户认证类型。目前只实现了Basic
(mod_auth_basic
)和Digest
(mod_auth_digest
)。
要实现认证,还必须同时与AuthName
和Require
指令一起使用。另外,服务器还必须包含一个认证支持模块(比如mod_authn_file
)和一个授权支持模块(比如mod_authz_user
)。
参见
CGIMapExtension 指令
说明 | 定位CGI脚本解释器 |
---|---|
语法 | CGIMapExtension cgi-path .extension |
作用域 | directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | NetWare only |
此指令用于定位Apache CGI脚本解释器。比如,"CGIMapExtension sys:\foo.nlm .foo
"将把所有具有.foo
后缀的CGI脚本文件传递给FOO解释器。
ContentDigest 指令
说明 | 允许生成Content-MD5 应答头 |
---|---|
语法 | ContentDigest On|Off |
默认值 | ContentDigest Off |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | Options |
状态 | 核心(C) |
模块 | core |
此指令遵照RFC1854和RFC2068协议的定义启用了Content-MD5
应答头的生成。
MD5是一种为不定长度的数据计算出一个"消息摘要"(有时也称为"指纹")的算法。并且保证数据中的任何变化都会反应在消息摘要的变化中。
Content-MD5
头提供了一种端到端的针对整个消息体的信息完整性检查方法。代理或者客户端会检查此头以侦测在传输过程中,消息体是否产生了意外的改变。一个头的例子如下:
Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==
请注意,因为对每个请求都要进行消息摘要的运算(没有对其值进行缓存),所以这会对您的服务器造成性能方面的影响。
Content-MD5
仅为由Apache核心
伺服的文档进行发送,而对于由模块处理的文档则不予理会。比如说SSI文档、CGI脚本的输出、字节范围的应答都不包括这个头。
DefaultType 指令
说明 | 在服务器无法由其他方法确定内容类型时,发送的默认MIME内容类型 |
---|---|
语法 | DefaultType MIME-type |
默认值 | DefaultType text/plain |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
有时会发生这样的事:服务器会被要求提供一个文档,而这个文档的类型无法由它的MIME类型映射所决定。
服务器必须通知客户端其文档的内容类型。所以当一个未知类型出现时,将会使用DefaultType
。例如:
DefaultType image/gif
这样的配置对于里面有很多gif图片而有些在文件名中缺少.gif
扩展名的目录非常合适。
注意,与ForceType
指令的不同之处在于:此指令仅提供了默认的mime类型。所有其它mime类型的定义,包括文件的扩展名,或其它可以标识媒体类型的方法都会覆盖此默认值。
<Directory> 指令
说明 | 封装一组指令,使之仅对文件空间中的某个目录及其子目录生效 |
---|---|
语法 | <Directory directory-path>
... </Directory> |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
<Directory>
和</Directory>
用于封装一组指令,使之仅对某个目录及其子目录生效。任何可以在"directory"作用域中使用的指令都可以使用。Directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串。在通配符字符串中,"?
"匹配任何单个的字符,"*
"匹配任何字符序列。您也可以使用"[]
"来确定字符范围。以上通配符都不能匹配"/"字符。所以<Directory /*/public_html>
将无法匹配/home/user/public_html
,但<Directory /home/*/public_html>
能够正确匹配。比如说:
<Directory /usr/local/httpd/htdocs>
Options Indexes FollowSymLinks
</Directory>
使用directory-path参数的时候要注意:它们必须与Apache用于访问文件的文件系统路径保持一致。赋予特定<Directory>
的指令将无法对通过不同路径指向的同一个目录文件生效,比如说通过另外一个符号连接生成的路径。
扩展的正则表达式也可以通过附加一个"~
"字符来使用。比如说:
<Directory ~ "^/www/(.+/)*[0-9]{3}">
将匹配/www/
下所有由3个数字组成的目录。
如果有多个(非正则表达式)<Directory>
配置段符合包含某文档的目录(或其父目录),那么指令将以短目录优先的规则进行应用。并包含.htaccess文件中的指令。比如说在
<Directory />
AllowOverride None
</Directory>
<Directory /home/>
AllowOverride FileInfo
</Directory>
中,访问文档/home/web/dir/doc.html
的步骤如下:
- 应用指令
AllowOverride None
(禁用.htaccess
文件)。 - 应用指令
AllowOverride FileInfo
(针对/home
目录)。 - 按顺序应用所有
/home/.htaccess
、/home/web/.htaccess
、/home/web/dir/.htaccess
中的FileInfo
组指令。
正则表达式将在所有普通配置段之后予以考虑。所有的正则表达式将根据它们出现在配置文件中的顺序进行应用。比如说,以下配置:
<Directory ~ abc$>
# ......
</Directory>
正则表达式配置段将在所有普通的<Directory>
和.htaccess
文件应用之后才予以考虑。所以正则表达式将匹配/home/abc/public_html/abc
并予以应用。
请注意:Apache对<Directory />
的默认访问权限为"Allow from All
"。这意味着Apache将伺服任何通过URL映射的文件。我们建议您将这个配置做如下屏蔽:
<Directory />
Order Deny,Allow
Deny from All
</Directory>
然后在您想要使之被访问的目录中覆盖此配置。参阅安全提示以获取更多详情。
一般来说<Directory>
指令只会出现在httpd.conf
文件中,但它们也可能出现在任何其它配置文件中。<Directory>
指令不可被嵌套使用,也不能出现在<Limit>
或<LimitExcept>
配置段中。
参见
- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。
<DirectoryMatch> 指令
说明 | 封装一些指令并作用于文件系统中匹配正则表达式的所有目录及其子目录 |
---|---|
语法 | <DirectoryMatch regex>
... </DirectoryMatch> |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
<DirectoryMatch>
和</DirectoryMatch>
用于封装一组指令。与<Directory>
类似,此指令将仅作用于指定名字的目录及其子目录。然而,它可以接受一个正则表达式作为参数。比如说:
<DirectoryMatch "^/www/(.+/)*[0-9]{3}">
将匹配/www/
下所有由3个数字组成的目录。
参见
<Directory>
获取如何在普通的<Directory>
中使用正则表达式的描述。- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。
DocumentRoot 指令
说明 | 组成网络上可见的主文档树的根目录 |
---|---|
语法 | DocumentRoot directory-path |
默认值 | DocumentRoot /usr/local/apache2/htdocs |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
此指令设置了httpd
伺服的目录。在没有使用类似Alias
这样的指令的情况下,服务器会将请求中的URL附加到DocumentRoot
后面以构成指向文档的路径。比如说:
DocumentRoot /usr/web
于是对http://www.my.host.com/index.html
的访问就会指向/usr/web/index.html
。如果directory-path不是绝对路径,则被假定为是相对于ServerRoot
的路径。
指定DocumentRoot
时不应包括最后的"/"。
参见
EnableMMAP 指令
说明 | 在递送中使用内存映射(memory-mapping)来读取文件 |
---|---|
语法 | EnableMMAP On|Off |
默认值 | EnableMMAP On |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
此指令指示httpd
在递送中如果需要读取一个文件的内容,它是否可以使用内存映射。当处理一个需要访问文件中的数据的请求时,比如说当递送一个使用mod_include
进行服务器端分析的文件时,如果操作系统支持,Apache将默认使用内存映射。
这种内存映射有时会带来性能的提高,但在某些情况下,您可能会需要禁用内存映射以避免一些操作系统的问题:
- 在一些多处理器的系统上,内存映射会减低一些
httpd
的性能。 - 在挂载了NFS的
DocumentRoot
上,若已经将一个文件进行了内存映射,则删除或截断这个文件会造成httpd
因为分段故障而崩溃。
在可能遇到这些问题的服务器配置过程中,您应当使用下面的命令来禁用内存映射:
EnableMMAP Off
对于挂载了NFS的文件夹,可以单独指定禁用内存映射:
<Directory "/path-to-nfs-files">
EnableMMAP Off
</Directory>
EnableSendfile 指令
说明 | 使用操作系统内核的sendfile支持来将文件发送到客户端 |
---|---|
语法 | EnableSendfile On|Off |
默认值 | EnableSendfile On |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 2.0.44 及以后的版本中可用 |
这个指令控制httpd
是否可以使用操作系统内核的sendfile支持来将文件发送到客户端。默认情况下,当处理一个请求并不需要访问文件内部的数据时(比如发送一个静态的文件内容),如果操作系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件。
这个sendfile机制避免了分开的读和写操作以及缓冲区分配,但是在一些平台或者一些文件系统上,最好禁止这个特性来避免一些问题:
- 一些平台可能会有编译系统检测不到的有缺陷的sendfile支持,特别是将在其他平台上使用交叉编译得到的二进制文件运行于当前对sendfile支持有缺陷的平台时。
- 在Linux上启用IPv6时,使用sendfile将会触发某些网卡上的TCP校验和卸载bug。
- 当Linux运行在Itanium处理器上的时候,sendfile可能无法处理大于2GB的文件。
- 对于一个通过网络挂载了NFS文件系统的
DocumentRoot
(比如:NFS或SMB),内核可能无法可靠的通过自己的缓冲区服务于网络文件。
如果出现以上情况,你应当禁用sendfile :
EnableSendfile Off
针对NFS或SMB,这个指令可以被针对目录的设置覆盖:
<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>
ErrorDocument 指令
说明 | 当遇到错误的时候服务器将给客户端什么样的应答 |
---|---|
语法 | ErrorDocument error-code document |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | 在Apache2.0中引用文字的语法发生了变化 |
当遇到问题或错误的时候,Apache能被配置为进行以下四种处理之一:
- 输出一个简单生硬的错误代码信息
- 输出一个经过定制的信息
- 重定向到一个本地的URL-path来处理这个问题(错误)
- 重定向到一个外部的URL来处理这个问题(错误)
默认会采取第1种方法,而第2-4种方法可以使用ErrorDocument
指令后面跟随一个HTTP应答代码和一个URL或信息来进行配置。Apache有时会额外提供一些信息来描述所发生的问题/错误。
URL可以由一个斜杠(/)开头来指示一个本地URL(相对于DocumentRoot
),或是提供一个能被客户端解释的完整的URL。此外还能提供一个可以被浏览器显示的消息。比如:
ErrorDocument 500 http://foo.example.com/cgi-bin/tester
ErrorDocument 404 /cgi-bin/bad_urls.pl
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Sorry can't allow you access today"
另外,特殊的"default
"值可以被用来指定使用Apache内置的、简单的硬编码消息。当不需要这个定制特性的时候,可以用"default
"恢复Apache内置的、简单的硬编码消息,否则将继承一个已有的ErrorDocument
。
ErrorDocument 404 /cgi-bin/bad_urls.pl
<Directory /web/docs>
ErrorDocument 404 default
</Directory>
请注意,如果您为ErrorDocument
指定了一个外部的URL(比如说,任何在开头指示了类似"http
"这样的访问方法的字符串),Apache将会向客户端发送一个重定向指令来告诉它在哪里找到这个文档,哪怕这个文档最后还是在这个服务器上。这里面包含着一些暗示:最重要的就是客户端无法接收到原始的错误状态代码,取而代之的是一个重定向状态代码。这将会使一些用状态代码来判断一个URL是否有效的web机器人或其它客户端产生误解。另外,如果您在"ErrorDocument 401
"中使用了外部URL,客户端将不会提示用户输入密码,因为它根本没收到这样一个401的状态代码。所以,如果您想使用"ErrorDocument 401
"指令,就必须指向一个本地的文档。
Microsoft Internet Explorer (MSIE)在服务器端产生的错误信息"很小"的时候会忽略它们而用自己"友好的"错误信息进行取代。这个大小的阈值根据错误类型而不同。但一般来说,如果您的错误信息的大小在512 byte以上,MSIE就会显示这些服务器端产生的错误文档而不会屏蔽它们。您可以在微软知识库的文章Q294807中获取更多信息。
虽然大多数错误信息可以被改写,但是在有些情况下,将仍然使用某些内置的错误信息而不管ErrorDocument
如何设置。特别是在检测到一个"畸形"请求的情况下,正常的请求处理过程将会被立即中断,并且立即返回一个内置的错误信息。这是为了防止某些不良请求可能导致的安全问题。
在2.0版以前,信息前面会用一个不配对的双引号作为前导标志。
参见
ErrorLog 指令
说明 | 存放错误日志的位置 |
---|---|
语法 | ErrorLog file-path|syslog[:facility] |
默认值 | ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows 和 OS/2) |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
ErrorLog
指令指定了当服务器遇到错误时记录错误日志的文件。如果file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot
的相对路径。
示例
ErrorLog /var/log/httpd/error_log
如果file-path以一个管道符号(|)开头,那么会为它指定一个命令来处理错误日志。
示例
ErrorLog "|/usr/local/bin/httpd_errors"
如果系统支持,使用"syslog
"替代文件名将通过syslogd(8)来记载日志。默认将使用系统日志机制local7
,但您可以用"syslog:facility
"语法来覆盖这个设置,其中,facility的取值为syslog(1)中记载的任何一个名字。
示例
ErrorLog syslog:user
安全提示:参阅安全提示文档获得关于为什么当记录日志文件的目录对于启动服务器以外的用户可写时会对您的服务器构成安全威胁。
注意
当在非Unix平台上输入文件路径的时候,路径分隔符必须统一使用正斜线(/),即使那个平台本身使用反斜线(\)。
参见
FileETag 指令
说明 | 用以创建ETag应答头的文件的属性 |
---|---|
语法 | FileETag component ... |
默认值 | FileETag INode MTime Size |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
FileETag
指令配置了当文档是基于一个文件时用以创建ETag
(实体标签)应答头的文件的属性(ETag
的值用于进行缓冲管理以节约网络带宽)。在Apache1.3.22及以前,ETag
的值总是由文件的inode(索引节点)、大小、最后修改时间决定。FileETag
指令可以让您选择(如果您想进行选择)这其中哪些要素将被使用。主要关键字如下:
- INode
- 文件的索引节点(inode)数
- MTime
- 文件的最后修改日期及时间
- Size
- 文件的字节数
- All
- 所有存在的域,等价于:
FileETag INode MTime Size
- None
- 如果一个文档是基于文件的,则不在应答中包含任何
ETag
头
可以在INode
, MTime
, Size
前加上"+
"或"-
"以改变由上层继承下来的默认值。任何没有上述前缀的关键字将立刻完全取消继承下来的设置。
如果一个目录的配置包含了"FileETag INode MTime Size
"而其一个子目录包含了"FileETag -INode
"那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于"FileETag MTime Size
"。
<Files> 指令
说明 | 包含作用于匹配指定文件名的指令 |
---|---|
语法 | <Files filename> ... </Files> |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
<Files>
指令提供了基于文件名的访问控制,类似于<Directory>
和<Location>
指令。它将配对一个</Files>
指令。在此配置段中定义的指令将作用于其基本名称(不是完整的路径)与指定的文件名相符的对象。<Files>
段将根据它们在配置文件中出现的顺序被处理:在<Directory>
段和.htaccess
文件被处理之后,但在<Location>
段之前。请注意:<Files>
能嵌入到<Directory>
段中以限制它们作用的文件系统范围。
filename参数应当是一个文件名或是一个包含通配符的字符串,其中"?
"匹配任何单个字符,"*
"匹配任何字符串序列。在"~
"字符之后同样可以使用正则表达式。比如:
<Files ~ "\.(gif|jpe?g|png)$">
将匹配绝大部分常见的因特网图象格式。然而在Apache1.3及其后继版本中,更推荐使用<FilesMatch>
指令。
请注意与<Directory>
和<Location>
配置段不同的是:<Files>
配置段可用于.htaccess
文件当中。这将允许用户在文件层面上控制对它们自己文件的访问。
参见
- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。
<FilesMatch> 指令
说明 | 包含作用于与正则表达式匹配的文件名的指令 |
---|---|
语法 | <FilesMatch regex> ... </FilesMatch> |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
<FilesMatch>
指令就像<Files>
指令一样提供了针对文件名的访问控制。然而,它使用的是正则表达式。比如说:
<FilesMatch "\.(gif|jpe?g|png)$">
将匹配最常见的internet图形文件格式。
参见
- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。
ForceType 指令
说明 | 强制所有匹配的文件被作为指定的MIME类型进行伺服 |
---|---|
语法 | ForceType MIME-type|None |
作用域 | directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | Apache 2.0之后从其它模块移动到核心中 |
当此指令放入.htaccess
文件或<Directory>
或<Location>
或<Files>
配置段时,此指令强制所有匹配的文件被当作在MIME-type中指定的Content-Type来伺服。比如说,如果您有一个包含大量GIF文件的目录,可您又不想全都为它们加上".gif
"扩展名的话,您可以这样做:
ForceType image/gif
请注意:与DefaultType
指令不同,此指令将覆盖所有的mime类型关联,包括标识文件类型的扩展名。
你可以通过使用"None
"覆盖任何ForceType
设置:
# 强制所有文件为 image/gif:
<Location /images>
ForceType image/gif
</Location>
# 但是正常的mime类型关联在这里:
<Location /images/mixed>
ForceType None
</Location>
HostnameLookups 指令
说明 | 启用对客户端IP的DNS查找 |
---|---|
语法 | HostnameLookups On|Off|Double |
默认值 | HostnameLookups Off |
作用域 | server config, virtual host, directory |
状态 | 核心(C) |
模块 | core |
此指令启用了DNS查询,使得主机名能被记入日志(并用REMOTE_HOST
变量传递给CGI/SSI)。参数Double
指定进行一次双向DNS查询。也就是说在一次反向查询之后,再对返回的结果进行一次正向查询。在正向查询结果中至少应该有一个ip地址与初始的地址相符。(在"tcpwrappers"中的术语是PARANOID
)
不论此处如何设置,当您使用mod_authz_host
来根据主机名控制访问的时候,就会执行一次双向查询。这对安全来说非常必要。请注意如果您没有设置"HostnameLookups Double
",这种双向查询的结果不是自动生成的。比如说:如果仅仅设置了"HostnameLookups On
"而且请求是针对一个根据主机名做了限制的对象,不论双向查询是否失败,CGI还是会把单向查询的结果用REMOTE_HOST
来传送。
默认值设置为 Off
是为了那些不需要进行反向查询的站点节约网络带宽考虑的。这对最终用户也是有益的,因为这样他们就不用忍受查询造成的延迟了。高访问量的网站应该将此指令设置为 Off
因为DNS查询会造成明显的时间消耗。在bin
目录下的logresolve
工具可以在离线的情况下对已经记入日志的IP地址进行主机名的查询。
<IfDefine> 指令
说明 | 封装一组只有在启动时当测试结果为真时才生效的指令 |
---|---|
语法 | <IfDefine [!]parameter-name> ...
</IfDefine> |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
<IfDefine test>...</IfDefine>
配置段用于包含有条件的指令。<IfDefine>
配置段中的指令仅当test结果为真时才进行处理。如果test为假。此配置段中的指令将会被忽略。
<IfDefine>
配置段中的test可以为以下两种形式之一:
- parameter-name
!
parameter-name
在第一种情况下,仅当parameter-name已经定义的情况下才对开始和结束标记之间的指令进行处理。第二种情况则截然相反。仅当parameter-name没有定义的情况下才进行指令的处理。
parameter-name是在服务启动时,通过httpd
命令行的 -Dparameter
这样的形式指定的。
<IfDefine>
配置段是可以嵌套的,从而可以实现简单的多参数测试。比如说:
httpd -DReverseProxy ...
# httpd.conf
<IfDefine ReverseProxy>
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/libproxy.so
</IfDefine>
<IfModule> 指令
说明 | 封装指令并根据指定的模块是否启用为条件而决定是否进行处理 |
---|---|
语法 | <IfModule [!]module-file|module-identifier> ... </IfModule> |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
兼容性 | module-identifier仅在 Apache 2.1 及以后的版本中可用 |
<IfModule test>...</IfModule>
配置段用于封装根据指定的模块是否启用而决定是否生效的指令。在<IfModule>
配置段中的指令仅当test为真的时候才进行处理。如果test为假,所有其间的指令都将被忽略。
<IfModule>
段中的test可以为以下两种方式之一:
- module
- !module
在第一种情况下,起始和结束标记之间的指令仅当module被载入后才被执行。此模块可以为编译时静态链接进核心的模块或是使用LoadModule
指令动态载入的模块。第二种情况则相反,仅当module没有载入时才进行指令的处理。
module可以是模块的标识符或者是编译模块时的文件名。比如,rewrite_module
就是一个模块标识符,而mod_rewrite.c
则是编译模块时的文件名。如果模块包含多个源代码文件,您应当使用包含STANDARD20_MODULE_STUFF
字符串的那个。
<IfModule>
配置段是可以嵌套的,从而可以实现简单的多模块测试。
<IfModule>
配置段中。Include 指令
说明 | 在服务器配置文件中包含其它配置文件 |
---|---|
语法 | Include file-path|directory-path |
作用域 | server config, virtual host, directory |
状态 | 核心(C) |
模块 | core |
兼容性 | 通配符仅在 Apache 2.0.41 及以后的版本中可用 |
这个指令允许在服务器配置文件中加入其它配置文件。
Shell风格(fnmatch()
)的通配符可以用于按照字母顺序一次包含多个文件。另外,如果Include
指向了一个目录而不是一个文件,Apache将读入该目录及其子目录下的所有文件,并依照字母顺序将这些文件作为配置文件进行解析。但是并不推荐这么做,因为偶尔会有临时文件在这个目录中生成,从而导致httpd
启动失败。
文件的路径可以是一个完整的绝对路径(以一个斜杠开头):
Include /usr/local/apache2/conf/ssl.conf
Include /usr/local/apache2/conf/vhosts/*.conf
或是相对于ServerRoot
目录的相对路径:
Include conf/ssl.conf
Include conf/vhosts/*.conf
请确保包含的目录中不包含任何诸如编辑器临时文件等引起误导的文件,因为Apache会尝试读取它们并把其中的内容作为配置指令来处理,这样可能会导致启动过程的失败。运行 apachectl configtest
将会把配置检查时所使用的所有文件列出来以供参考。这将有助于检验配置中是否仅包含了您所希望出现那些文件。
root@host# apachectl configtest
Processing config file: /usr/local/apache2/conf/ssl.conf
Processing config file: /usr/local/apache2/conf/vhosts/vhost1.conf
Processing config file: /usr/local/apache2/conf/vhosts/vhost2.conf
Syntax OK
参见
KeepAlive 指令
说明 | 启用HTTP持久链接 |
---|---|
语法 | KeepAlive On|Off |
默认值 | KeepAlive On |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
Keep-Alive扩展自HTTP/1.0和HTTP/1.1的持久链接特性。提供了长效的HTTP会话,用以在同一个TCP连接中进行多次请求。在某些情况下,这样的方式会对包含大量图片的HTML文档造成的延时起到50%的加速作用。在Apache1.2版本以后,您可以设置 KeepAlive On
以启用持久链接。
对于HTTP/1.0的客户端来说,仅当客户端指定使用的时候才会使用持久链接连接。此外,仅当能够预先知道传输的内容长度时,才会与HTTP/1.0的客户端建立持久链接连接。这意味着那些长度不定的内容,诸如CGI输出、SSI页面、以及服务器端生成的目录列表等内容一般来说将无法使用与HTTP/1.0客户端建立的持久链接连接。而对于HTTP/1.1的客户端来说,如果没有进行特殊指定,持久将是默认的连接方式。如果客户端进行了请求,将使用分块编码以解决在持久链接里发送未知长度内容的问题。
参见
KeepAliveTimeout 指令
说明 | 持久链接中服务器在两次请求之间等待的秒数 |
---|---|
语法 | KeepAliveTimeout seconds |
默认值 | KeepAliveTimeout 5 |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
Apache在关闭持久连接前等待下一个请求的秒数。一旦收到一个请求,超时值将会被设置为Timeout
指令指定的秒数。
对于高负荷服务器来说,KeepAliveTimeout
值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。
<Limit> 指令
说明 | 仅对指定的HTTP方法进行访问控制 |
---|---|
语法 | <Limit method [method] ... > ... </Limit> |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
访问控制一般来说是对所有的访问方法都生效的,这也是我们普遍希望达到的效果。一般情况下,访问控制指令不应该放入<Limit>
段中。
<Limit>
指令的目的是限制访问控制的效果使其仅作用于某些HTTP方法。对于其它方法,<Limit>
括号中的访问限制将不起任何作用。下例中的访问控制仅作用于POST
, PUT
, DELETE
方法,其它方法不受任何影响:
<Limit POST PUT DELETE>
Require valid-user
</Limit>
列出的方法名可为下列的一个或多个:GET
, POST
, PUT
, DELETE
, CONNECT
, OPTIONS
, PATCH
, PROPFIND
, PROPPATCH
, MKCOL
, COPY
, MOVE
, LOCK
, UNLOCK
。方法名是大小写敏感的。如果对GET
进行了定义,它会同时作用于HEAD
请求。TRACE
方法不能被限制。
<LimitExcept> 指令
说明 | 对除了指定方法以外的所有HTTP方法进行访问控制 |
---|---|
语法 | <LimitExcept method [method] ... > ... </LimitExcept> |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
<LimitExcept>
和</LimitExcept>
用于封装一组访问控制指令,并将其作用于所有没有在参数中标出的HTTP方法。也就是说,与<Limit>
相反,它用于控制标准的和非标准以及无法辨识的方法。
比如:
<LimitExcept POST GET>
Require valid-user
</LimitExcept>
LimitInternalRecursion 指令
说明 | 指定内部重定向和嵌套子请求的最大数量 |
---|---|
语法 | LimitInternalRecursion number [number] |
默认值 | LimitInternalRecursion 10 |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 2.0.47 及以后的版本中可用 |
例如,当使用Action
指令内部重定向原始请求到一个CGI脚本时,一个内部重定向将会发生。子请求是Apache的一个用于找到如果一个URI被请求时将会发生什么的机制。例如,mod_dir
使用子请求来寻找那些根据DirectoryIndex
指令应当被列出的文件。
LimitInternalRecursion
可以防止服务器进入一个内部重定向或者子请求的死循环而崩溃。这样的死循环通常由错误的配置引起。
这个指令存储了两个不同的限制,这两个限制是基于每个单独的请求进行计算的。第一个number限制了内部重定向链的最大长度(一个接一个)。第二个number限制了子请求的最大嵌套层数。如果你只指定了一个number ,那么将会被同时应用于这两个限制。
示例
LimitInternalRecursion 5
LimitRequestBody 指令
说明 | 限制客户端发送的HTTP请求体的最大字节长度 |
---|---|
语法 | LimitRequestBody bytes |
默认值 | LimitRequestBody 0 |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
bytes在0(意味着无限制)到2147483647(2GB)间限制了请求体所允许的字节数。
LimitRequestBody
可以让用户在其作用范围内(整个服务器、特定目录、特定文件、特定位置)设置一个允许客户端发送的HTTP请求体的最大字节长度的限制。如果客户端的请求超出了这个限制,服务器会回应一个错误而不是伺服这个请求。一个普通请求的信息体在很大程度上取决于资源的自然属性和这个资源允许的方法。CGI脚本经常用消息体把表单的信息传递给服务器。使用PUT
方法至少会需要与服务器期望从这个资源得到的信息量差不多大小的值。
此指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。
比如,如果您允许文件上传到某个位置,而且希望能将上传文件的大小设置为100K,您可以使用下面的指令:
LimitRequestBody 102400
LimitRequestFields 指令
说明 | 限制接受客户端请求中HTTP请求头域的数量 |
---|---|
语法 | LimitRequestFields number |
默认值 | LimitRequestFields 100 |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
Number是一个0(意味着不限)到32767之间的整数。默认值为编译时的常量DEFAULT_LIMIT_REQUEST_FIELDS
(发布值为100)。
LimitRequestFields
指令允许服务器管理员修改在一个HTTP请求中的请求头域的数量限制。服务器需要此值大于一个普通客户端请求中包含头域的数量。一个客户端请求头域的数量很少大于20,但根据客户端的不同这个数字有很大的差别,经常取决于用户配置他们的浏览器扩展以支持更详细的内容协商。可选的HTTP扩展经常使用请求头域来实现。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。如果正常使用的客户端得到了服务器的错误应答,指出其在请求中发送了过多的头域,您应该适当的增大此值。
例如:
LimitRequestFields 50
LimitRequestFieldSize 指令
说明 | 限制客户端发送的请求头的字节数 |
---|---|
语法 | LimitRequestFieldsize bytes |
默认值 | LimitRequestFieldsize 8190 |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
bytes指定了HTTP请求头允许的字节大小。
LimitRequestFieldSize
指令允许服务器管理员增加或减少HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。SPNEGO的认证头最大可能达到12392字节。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。
举例如下:
LimitRequestFieldSize 4094
LimitRequestLine 指令
说明 | 限制接受客户端发送的HTTP请求行的字节数 |
---|---|
语法 | LimitRequestLine bytes |
默认值 | LimitRequestLine 8190 |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
bytes将设置HTTP请求行的字节数限制。
LimitRequestLine
指令允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI、协议版本,所以LimitRequestLine
指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在GET
请求中所传递的查询部分的所有信息。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。
举例如下:
LimitRequestLine 4094
LimitXMLRequestBody 指令
说明 | 限制基于XML的请求体的大小 |
---|---|
语法 | LimitXMLRequestBody bytes |
默认值 | LimitXMLRequestBody 1000000 |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
限制基于XML的请求体大小的最大字节数,"0
"将禁用这一检查。
比如:
LimitXMLRequestBody 0
<Location> 指令
说明 | 将封装的指令作用于匹配的URL |
---|---|
语法 | <Location
URL-path|URL> ... </Location> |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
<Location>
提供了基于URL的访问控制。与<Directory>
指令类似,它也会启用一个以</Location>
结尾的配置段。<Location>
配置段的处理位于<Directory>
, .htaccess
, <Files>
之后,并依照在配置文件中出现的顺序进行处理。
<Location>
配置段完全独立于文件系统之外操作。这有几个重要的后果。最重要的是<Location>
不能用于针对文件系统的访问控制。因为可能会有几个不同的URL指向文件系统中的同一个文件,所以这样的控制常常会被很容易的绕过。
何时使用<Location>
?
使用<Location>
来将指令应用于独立于文件系统之外的内容。文件系统之内的内容请使用<Directory>
和<Files>
指令。不过一个例外是<Location />
,它可以方便的作用于所用URL。
对所有的原始(非代理)请求来说,匹配的URL应该是具有"/path/
"形式的URL路径。不包括访问方法、主机名、端口或查询字符串等。对于代理的请求,匹配的URL必须为"scheme://servername/path
"的形式,而且必须包括前缀。
URL可以用一个通配符字符串来进行通配符的处理。"?
"匹配任何单个的字符,而"*
"匹配所有字符序列。
也可以附加"~
"字符来表示使用正则表达式。例如:
<Location ~ "/(extra|special)/data">
将匹配所有包含字符串"/extra/data
"或"/special/data
"的URL。在Apache1.3及其后续版本中,加入了一个新的推荐使用的<LocationMatch>
指令,其功能与<Location>
的正则表达式版本相同。
<Location>
的功能在与SetHandler
指令联用时能发挥最大效能。比如启用状态请求,但仅对来自foo.com
的用户起效,您可以这样使用:
<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
</Location>
请注意"/"(斜线)
斜线字符根据它在URL中出现的位置不同有着特殊的意义。大家可能都已经习惯在文件系统中,多个连续的斜线会被作为单一的斜线处理(例如"/home///foo
"与"/home/foo
"相同)。但在URL里面,这样是行不通的。<LocationMatch>
指令和正则表达式版本的<Location>
要求您明确使用多重斜线。比如:<LocationMatch ^/abc>
将匹配请求"/abc
"但不会匹配请求"//abc
"。而非正则表达式版本的<Location>
指令在用于代理请求时,也有类似表现。但当非正则表达式版本的<Location>
作用于非代理请求时,它会将多个毗邻的斜线认作单个斜线。比如,如果您指定了<Location /abc/def>
而请求是指向"/abc//def
"的,那么它们就是匹配的。
参见
- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。
<LocationMatch> 指令
说明 | 将封装的指令作用于正则表达式匹配的URL |
---|---|
语法 | <LocationMatch
regex> ... </LocationMatch> |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
<LocationMatch>
和<Location>
指令相同,提供了基于URL的访问控制。但它使用正则表达式作为参数,而不是简单字符串。比如:
<LocationMatch "/(extra|special)/data">
将匹配包含子串"/extra/data
"或"/special/data
"的URL。
参见
- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。
LogLevel 指令
说明 | 控制错误日志的详细程度 |
---|---|
语法 | LogLevel level |
默认值 | LogLevel warn |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
LogLevel
用于调整记录在错误日志中的信息的详细程度。(参见ErrorLog
指令)。可以选择下列level,依照重要性降序排列:
Level | 描述 | 例子 |
---|---|---|
emerg | 紧急(系统无法使用) | "Child cannot open lock file. Exiting" |
alert | 必须立即采取措施 | "getpwuid: couldn't determine user name from uid" |
crit | 致命情况 | "socket: Failed to get a socket, exiting child" |
error | 错误情况 | "Premature end of script headers" |
warn | 警告情况 | "child process 1234 did not exit, sending another SIGHUP" |
notice | 一般重要情况 | "httpd: caught SIGBUS, attempting to dump core in ..." |
info | 普通信息 | "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." |
debug | 调试信息 | "Opening config file ..." |
当指定了某个级别时,所有级别高于它的信息也会被同时记录。比如,指定 LogLevel info
,则所有notice
和warn
级别的信息也会被记录。
建议至少使用crit
级别。
示例如下:
LogLevel notice
注意
当错误日志是一个单独分开的正式文件的时候,notice
级别的消息总是会被记录下来,而不能被屏蔽。但是,当使用syslog
来记录时就没有这个问题。
MaxKeepAliveRequests 指令
说明 | 一个持久链接中允许的最大请求数量 |
---|---|
语法 | MaxKeepAliveRequests number |
默认值 | MaxKeepAliveRequests 100 |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
MaxKeepAliveRequests
指令限制了当启用KeepAlive
时,每个连接允许的请求数量。如果将此值设为"0
",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。
例如:
MaxKeepAliveRequests 500
NameVirtualHost 指令
说明 | 为一个基于域名的虚拟主机指定一个IP地址(和端口) |
---|---|
语法 | NameVirtualHost addr[:port] |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
如果您要配置基于域名的虚拟主机,NameVirtualHost
指令就是您必须的指令之一。
尽管addr参数可以使用主机名,但建议您还是使用IP地址。比如:
NameVirtualHost 111.22.33.44
使用NameVirtualHost
指令,您可以指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。在一个防火墙或是其它代理接受了请求并把它转到服务器所在的另外一个IP地址上的情况下,您必须指定伺服请求的机器物理界面上的IP地址。如果您对于多个地址使用了多个基于域名的虚拟主机,您应该为每个地址使用这个指令。
注意
"主服务器"和任何其它"_default_
"服务器都不会伺服发送到NameVirtualHost
IP地址的请求。(除非您指定了NameVirtualHost
,但没有为这个地址指定任何VirtualHost
)。
另外,您还可以为您使用的基于域名的虚拟主机指定一个端口号。比如:
NameVirtualHost 111.22.33.44:8080
IPv6地址必须封装在一对方括号内,如下例所示:
NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080
为了接受所有界面的请求,您可以使用"*
":
NameVirtualHost *
<VirtualHost>
指令的参数
请注意,<VirtualHost>
指令的参数必须与NameVirtualHost
指令的参数完全匹配。
NameVirtualHost 1.2.3.4
<VirtualHost 1.2.3.4>
# ...
</VirtualHost>
参见
Options 指令
说明 | 配置在特定目录中可以使用哪些特性 |
---|---|
语法 | Options [+|-]option [[+|-]option] ... |
默认值 | Options All |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | Options |
状态 | 核心(C) |
模块 | core |
Options
指令控制了在特定目录中将使用哪些服务器特性。
option可以为None
,在这种情况下,将不启用任何额外特性。或设置为以下选项中的一个或多个:
All
- 除
MultiViews
之外的所有特性。这是默认设置。 ExecCGI
- 允许使用
mod_cgi
执行CGI脚本。 FollowSymLinks
- 服务器允许在此目录中使用符号连接。
注意:即使服务器会使用符号连接,但它不会改变用于匹配
<Directory>
段的路径名。注意:如果此配置位于
<Location>
配置段中,则此设置会被忽略。 Includes
- 允许使用
mod_include
提供的服务器端包含。 IncludesNOEXEC
- 允许服务器端包含,但禁用"
#exec cmd
"和"#exec cgi
"。但仍可以从ScriptAlias
目录使用"#include virtual
"虚拟CGI脚本。 Indexes
- 如果一个映射到目录的URL被请求,而此目录中又没有
DirectoryIndex
(例如:index.html
),那么服务器会返回由mod_autoindex
生成的一个格式化后的目录列表。 MultiViews
- 允许使用
mod_negotiation
提供内容协商的"多重视图"(MultiViews)。 SymLinksIfOwnerMatch
- 服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。
注意
如果此配置出现在<Location>
配置段中,此选项将被忽略。
一般来说,如果一个目录被多次设置了Options
,则最特殊的一个会被完全接受(其它的被忽略),而各个可选项的设定彼此并不融合(参见配置段的合并)。然而,如果所有作用于Options
指令的可选项前都加有"+
"或"-
"符号,此可选项将被合并。所有前面加有"+
"号的可选项将强制覆盖当前的可选项设置,而所有前面有"-
"号的可选项将强制从当前可选项设置中去除。
比如,没有任何"+
"或"-
"符号:
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options Includes
</Directory>
那么只有将Includes
设置到/web/docs/spec
目录上。然而如果第二个Options
指令使用了"+
"和"-
"符号:
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>
那么就会有FollowSymLinks
和Includes
设置到/web/docs/spec
目录上。
注意
使用 -IncludesNOEXEC
或 -Includes
时,不论前面如何设置,都会完全禁用服务器端包含。
没有其它设置时,默认设置为 All
。
Require 指令
说明 | 指定哪些认证用户允许访问该资源 |
---|---|
语法 | Require entity-name [entity-name] ... |
作用域 | directory, .htaccess |
覆盖项 | AuthConfig |
状态 | 核心(C) |
模块 | core |
这个指令指定哪些认证用户允许访问该资源。这些限制由授权支持模块实现。语法如下:
Require user userid [userid] ...
- 只有指定的用户可以访问此目录。
Require group group-name [group-name] ...
- 只有隶属于指定组的用户可以访问此目录。
Require valid-user
- 所有有效用户都可以访问此目录。
提供Require
指令的授权支持模块有:mod_authz_user
, mod_authz_groupfile
, mod_authnz_ldap
, mod_authz_dbm
, mod_authz_owner
。
Require
必须伴随AuthName
和AuthType
指令,以及诸如AuthUserFile
和AuthGroupFile
指令(用以定义用户和用户组)以确保其能够正确工作。例如:
AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /web/users
AuthGroupFile /web/groups
Require group admin
使用这种方法提供的访问控制对所有方法都有效。这是一般情况下期望达到的效果。如果您仅希望对某个特定的方法加以限制,而不涉及其它方法时,您可以将Require
语句放入<Limit>
配置段中。
如果Require
与Allow
或Deny
指令同时使用,那么这些指令之间的相互作用由Satisfy
指令控制。
在子目录中删除访问控制
下面的例子展示了如何使用Satisfy
指令在一个受保护的目录下的子目录中取消访问控制。使用这种方法必须十分小心,因为它取消了mod_authz_host
实现的任何访问控制。
<Directory /path/to/protected/>
Require user david
</Directory>
<Directory /path/to/protected/unprotected>
# 该目录下的所有认证和访问控制都被取消了
Satisfy Any
Allow from all
</Directory>
参见
RLimitCPU 指令
说明 | 限制Apache子进程派生的进程占用CPU的最大秒数 |
---|---|
语法 | RLimitCPU seconds|max [seconds|max] |
默认值 | 未定义,使用操作系统默认值 |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max
"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root
运行服务器或是在初始化启动语句中进行设置。
这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。
CPU资源限制表示为每进程占用的秒数。
参见
RLimitMEM 指令
说明 | 限制由Apache子进程派生的进程占用的最大内存字节数 |
---|---|
语法 | RLimitMEM bytes|max [bytes|max] |
默认值 | 未定义,使用操作系统默认值 |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max
"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root
运行服务器或是在初始化启动语句中进行设置。
这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。
内存资源限制表示为每进程占用的字节数。
参见
RLimitNPROC 指令
说明 | 限制由Apache子进程派生的进程所派生的进程数目 |
---|---|
语法 | RLimitNPROC number|max [number|max] |
默认值 | 未定义,使用操作系统默认值 |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max
"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root
运行服务器或是在初始化启动语句中进行设置。
这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。
进程限制控制了每个用户的进程数。
注意
如果CGI进程不是以web服务器的uid启动的,那么这个指令将限制服务器自己能够创建的进程数目。此种情况将在error_log
中以"cannot fork
"进行记录。
参见
Satisfy 指令
说明 | 主机级别的访问控制和用户认证之间的相互关系 |
---|---|
语法 | Satisfy Any|All |
默认值 | Satisfy All |
作用域 | directory, .htaccess |
覆盖项 | AuthConfig |
状态 | 核心(C) |
模块 | core |
兼容性 | 2.0.51及以后版本中受<Limit> 和<LimitExcept> 指令影响 |
同时使用Allow
和Require
时的访问策略。参数可以设置为 All
或 Any
。这个指令仅在某个特定区域的访问控制同时被用户名/密码和客户端主机地址进行限定的时候起作用。默认行为(All
)采取客户端首先通过地址访问限制并且输入有效的用户名和密码的方式。使用可选项 Any
将使客户端在通过主机限制或是输入一个有效的用户名和密码两种方式之一得到访问权限。这样,就可以通过密码来限制一个区域的访问,但允许某些特定地址的客户端访问时不需要输入密码。
比如,如果您想让您局域网内的用户访问您的web网站时不受限制,但局域网外的用户需提供密码才能进行访问,您可以采取类似如下的配置:
Require valid-user
Allow from 192.168.1
Satisfy Any
从2.0.51版本开始,Satisfy
指令可以被限定于由<Limit>
和<LimitExcept>
配置段指定的特定的方法。
参见
ScriptInterpreterSource 指令
说明 | 定位CGI脚本解释器 |
---|---|
语法 | ScriptInterpreterSource Registry|Registry-Strict|Script |
默认值 | ScriptInterpreterSource Script |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅用于Win32;Registry-Strict 选项仅在 Apache 2.0 及以后的版本中可用 |
这个指令控制Apache如何找到运行CGI脚本的解释器。默认为Script
,使用在脚本中以"#!
"行指定的解释器。在Win32上这一行通常看上去像:
#!C:/Perl/bin/perl.exe
或者,如果perl
的位置已经在PATH
中指定,则可以简单的写成:
#!perl
设置为 ScriptInterpreterSource Registry
将使用脚本文件扩展名(比如.pl
)作为搜索项对Windows注册表项HKEY_CLASSES_ROOT
进行搜索。 这个命令由注册表子键Shell\ExecCGI\Command
或Shell\Open\Command
定义(如果前者不存在)。如果无法找到该注册表项,Apache将采用默认值:Script
。
安全
将 ScriptInterpreterSource Registry
和使用了ScriptAlias
的目录一起使用时需要非常小心,因为Apache会执行这个目录下的所有文件。Registry
设置可能会导致对不可执行文件的不期望的程序调用。例如,在大多数Windows上默认打开.htm
文件的程序是IE,所以任何一个对脚本目录中.htm
文件的请求将会在服务器后台打开一个IE。这是一个让你的服务器在数分钟内崩溃的好办法。
Registry-Strict
选项和Registry
差不多,但是只使用Shell\ExecCGI\Command
子键。ExecCGI
键不是一个普通的键。它必须在注册表中手动配置,从而可以防止意外的程序调用。
ServerAdmin 指令
说明 | 服务器返回给客户端的错误信息中包含的管理员邮件地址 |
---|---|
语法 | ServerAdmin email-address|URL |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
ServerAdmin
设置了在所有返回给客户端的错误信息中包含的管理员邮件地址。如果httpd
不能将提供的参数识别为URL,它就会假定它是一个email-address ,并在超连接中用在mailto:
后面。推荐使用一个Email地址,因为许多CGI脚本是这样认为的。如果你确实想使用URL,一定要保证指向一个你能够控制的服务器,否则用户将无法确保一定可以和你取得联系。
为这个目的专门设置一个邮箱是值得的,比如:
ServerAdmin [email protected]
因为用户一般不会注意到他们在讨论服务器的问题!
ServerAlias 指令
说明 | 匹配一个基于域名的虚拟主机的别名 |
---|---|
语法 | ServerAlias hostname [hostname] ... |
作用域 | virtual host |
状态 | 核心(C) |
模块 | core |
ServerAlias
指令设定主机的别名,用于基于域名的虚拟主机。
<VirtualHost *>
ServerName server.domain.com
ServerAlias server server2.domain.com server2
# ...
</VirtualHost>
参见
ServerName 指令
说明 | 服务器用于辨识自己的主机名和端口号 |
---|---|
语法 | ServerName fully-qualified-domain-name[:port] |
作用域 | server config, virtual host |
状态 | 核心(C) |
模块 | core |
兼容性 | 在2.0版中,这个指令代替了1.3版的Port 指令的功能 |
ServerName
指令设置了服务器用于辨识自己的主机名和端口号。这主要用于创建重定向URL。比如,一个放置web服务器的主机名为simple.example.com
,但同时有一个DNS别名www.example.com
。而您希望web服务器更显著一点,您可以使用如下的指令:
ServerName www.example.com:80
当没有指定ServerName
时,服务器会尝试对IP地址进行反向查询来推断主机名。如果在ServerName
中没有指定端口号,服务器会使用接受请求的那个端口。为了加强可靠性和可预测性,您应该使用ServerName
显式的指定一个主机名和端口号。
如果使用的是基于域名的虚拟主机,在<VirtualHost>
段中的ServerName
将是为了匹配这个虚拟主机,在"Host:
"请求头中必须出现的主机名。
参见UseCanonicalName
和UseCanonicalPhysicalPort
指令以获得关于自引用URL(比如使用mod_dir
模块)是需要指定一个特定端口,还是使用客户端请求的端口号的更详细的信息。
参见
ServerPath 指令
说明 | 为兼容性不好的浏览器访问基于域名的虚拟主机保留的URL路径名 |
---|---|
语法 | ServerPath URL-path |
作用域 | virtual host |
状态 | 核心(C) |
模块 | core |
ServerPath
指令为主机设置了保守的(legacy)URL路径名,用于和基于域名的虚拟主机配合使用。
参见
ServerRoot 指令
说明 | 安装服务器的基础目录 |
---|---|
语法 | ServerRoot directory-path |
默认值 | ServerRoot /usr/local/apache |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
ServerRoot
指令设置了服务器所在的目录。一般来说它将包含conf/
和logs/
子目录。其它配置文件的相对路径即基于此目录 (比如Include
或LoadModule
)。
示例
ServerRoot /home/httpd
参见
httpd
的-d
选项- 安全提示中关于如何正确设置
ServerRoot
权限的部分
ServerSignature 指令
说明 | 配置服务器生成页面的页脚 |
---|---|
语法 | ServerSignature On|Off|EMail |
默认值 | ServerSignature Off |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | All |
状态 | 核心(C) |
模块 | core |
ServerSignature
指令允许您配置服务器端生成文档的页脚(错误信息、mod_proxy
的ftp目录列表、mod_info
的输出)。您启用这个页脚的原因主要在于处于一个代理服务器链中的时候,用户基本无法辨识出究竟是链中的哪个服务器真正产生了返回的错误信息。
默认的 Off
设置没有错误行(这样便与Apache1.2及更旧版本兼容)。采用 On
会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName
,而 EMail
设置会如文档中说明的那样额外创建一个指向ServerAdmin
的"mailto:"部分。
对于2.0.44以后的版本,显示的详细服务器版本号将由ServerTokens
指令控制。
参见
ServerTokens 指令
说明 | 配置"Server: "应答头 |
---|---|
语法 | ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full |
默认值 | ServerTokens Full |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
这个指令控制了服务器回应给客户端的"Server:
"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息。
ServerTokens Prod[uctOnly]
- 服务器会发送(比如):
Server: Apache
ServerTokens Major
- 服务器会发送(比如):
Server: Apache/2
ServerTokens Minor
- 服务器会发送(比如):
Server: Apache/2.0
ServerTokens Min[imal]
- 服务器会发送(比如):
Server: Apache/2.0.41
ServerTokens OS
- 服务器会发送(比如):
Server: Apache/2.0.41 (Unix)
ServerTokens Full
(或未指定)- 服务器会发送(比如):
Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
此设置将作用于整个服务器,而且不能用在虚拟主机的配置段中。
2.0.44版本以后,这个指令还控制着ServerSignature
指令的显示内容。
参见
SetHandler 指令
说明 | 强制所有匹配的文件被一个指定的处理器处理 |
---|---|
语法 | SetHandler handler-name|None |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
兼容性 | 在Apache2.0中移入核心 |
当这个指令放入.htaccess
或<Directory>
或<Location>
配置段中时,这个指令将强制所有匹配的文件通过handler-name指定的处理器处理。比如:如果想不管某个目录中的文件具有什么扩展名,都将它作为图像映射规则文件来解析,您可以将下例放入那个目录的.htaccess
中:
SetHandler imap-file
再来一个例子:如果您想当http://servername/status
被请求时,服务器显示一个状态报告,您可以将下面的语句放入httpd.conf
里面:
<Location /status>
SetHandler server-status
</Location>
你可以通过使用 None
来改写一个早先定义的SetHandler
指令。
参见
SetInputFilter 指令
说明 | 设置处理客户端请求和POST输入时使用的过滤器 |
---|---|
语法 | SetInputFilter filter[;filter...] |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
SetInputFilter
指令为服务器接受并处理客户端请求和POST输入设置了过滤器。这是在其它地方(包括AddInputFilter
指令)设置的过滤器以外附加的过滤器。
如果设置了多于一个过滤器,它们必须按照处理内容的顺序用分号(;)分隔。
参见
- 过滤器文档
SetOutputFilter 指令
说明 | 设置用于处理服务器输出应答的过滤器 |
---|---|
语法 | SetOutputFilter filter[;filter...] |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
SetOutputFilter
指令设置了用于在服务器应答发送到客户端之前使用的过滤器。这是在其它地方(包括AddOutputFilter
指令)设置的过滤器以外附加的过滤器。
例如:下述配置将会把/www/data/
目录下的所有文件作为SSI文件来处理。
<Directory /www/data/>
SetOutputFilter INCLUDES
</Directory>
如果设置了多于一个过滤器,它们必须按照处理内容的顺序用分号(;)分隔。
参见
- 过滤器文档
TimeOut 指令
说明 | 服务器在断定请求失败前等待的秒数 |
---|---|
语法 | TimeOut seconds |
默认值 | TimeOut 300 |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
TimeOut
指令用于设置Apache等待以下三种事件的时间长度:
- 接受一个GET请求耗费的总时间。
- POST或PUT请求时,接受两个TCP包之间的时间。
- 应答时TCP包传输中两个ACK包之间的时间。
我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。
TraceEnable 指令
说明 | 确定如何处理TRACE 请求 |
---|---|
语法 | TraceEnable [on|off|extended] |
默认值 | TraceEnable on |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 1.3.34, 2.0.55 及以后的版本中可用 |
这个指令同时决定了核心和mod_proxy
模块如何处理TRACE
请求。默认(TraceEnable on
)允许处理RFC2616定义的禁止附带任何请求体的TRACE
请求。TraceEnable off
则使核心和mod_proxy
模块向客户端返回一个"405
"(禁止的方法)错误。
最后,为了测试和诊断,可以设置"TraceEnable extended
"以允许附带请求体。核心(原始服务器)将会将请求体大小限制为64k以下(如果使用了 Transfer-Encoding: chunked
头,可以再为HTTP头增加8k)。核心会同时限制应答头和应答体;代理服务器则没有对请求体加以64k的限制。
UseCanonicalName 指令
说明 | 配置服务器如何确定它自己的域名和端口 |
---|---|
语法 | UseCanonicalName On|Off|DNS |
默认值 | UseCanonicalName Off |
作用域 | server config, virtual host, directory |
状态 | 核心(C) |
模块 | core |
在很多情况下,Apache必须构造一个自引用URL(即一个指回相同服务器的URL)。使用 UseCanonicalName On
会将ServerName
这个域名用于所有自引用URL、SERVER_NAME
、CGI中的SERVER_PORT
。
设置为 UseCanonicalName Off
时,如果客户端提供了主机名和端口(否则将如上所述使用标准域名),Apache将会使用这些信息来构建自引用URL。这些值与用于实现基于域名的虚拟主机的值相同,并且对于同样的客户端可用。CGI变量SERVER_NAME
和SERVER_PORT
也会由客户端提供的值来构建。
用这样的方式成功解决问题的例子如下:在一个局域网内,您想让连接主机的用户使用诸如www
这样的短域名进行访问。您会注意到,如果用户键入了类似http://www/splat
这样的短域名和目录的URL,并且没有最后的斜线,Apache会将他们重定向到http://www.domain.com/splat/
。如果您在这个目录上启用了身份验证,这会导致用户必须进行两次验证:一次针对www
而另外一次针对www.domain.com
(参见关于此主题的FAQ获得更多信息)。但如果UseCanonicalName
设为 Off
,Apache就会重定向到http://www/splat/
。
第三个可选项是 UseCanonicalName DNS
,用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:
"头的浏览器使用。使用这个选项时,Apache将对客户端连入的服务器的IP地址进行反向DNS查询,以构建自引用URL。
警告
如果CGI对SERVER_NAME
的值作出了假定,它们会被此选项破坏。客户端对于给出它们想要的主机名这样的行动是完全不受限制的。但如果CGI仅使用SERVER_NAME
来构建自引用的URL,它们会工作的很好。
参见
UseCanonicalPhysicalPort 指令
说明 | 配置服务器如何确定自己的名字和端口 |
---|---|
语法 | UseCanonicalPhysicalPort On|Off |
默认值 | UseCanonicalPhysicalPort Off |
作用域 | server config, virtual host, directory |
状态 | 核心(C) |
模块 | core |
兼容性 | 仅在 Apache 2.2.0 及以后的版本中可用 |
在很多情况下,Apache必须构造一个自引用URL(即一个指回相同服务器的URL)。在 UseCanonicalPhysicalPort On
的时候,Apache将有可能在构造服务器的规范端口时为了符合UseCanonicalName
指令而使用实际的物理端口号(physical port)。在 UseCanonicalPhysicalPort Off
的时候,Apache将不会使用实际的物理端口号,而是依赖所有已经配置的信息来构造一个合法的端口号。
注意
决定使用物理端口号的次序如下:
UseCanonicalName On
Servername
指定的端口号- 物理端口号
- 默认端口号
UseCanonicalName Off | DNS
- "
Host:
"请求头提供的端口号 - 物理端口号
Servername
指定的端口号- 默认端口号
在 UseCanonicalPhysicalPort Off
的情况下,物理端口号将会从上述顺序中剔除。
参见
<VirtualHost> 指令
说明 | 包含仅作用于指定主机名或IP地址的指令 |
---|---|
语法 | <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> |
作用域 | server config |
状态 | 核心(C) |
模块 | core |
<VirtualHost>
和</VirtualHost>
用于封装一组仅作用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在<VirtualHost>
配置段中的指令。Addr可以是:
- 虚拟主机的IP地址
- 虚拟主机IP地址对应的完整域名
- 字符"
*
",仅与"NameVirtualHost *
"配合使用以匹配所有的IP地址 - 字符串"
_default_
",与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址
示例
<VirtualHost 10.1.2.3>
ServerAdmin [email protected]
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>
IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。一个IPv6的示例如下:
<VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
ServerAdmin [email protected]
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
</VirtualHost>
每个虚拟主机必须对应不同的IP地址、端口号或是不同的主机名。在第一种情况下,服务器所在的物理机器必须配置为可以为多个IP地址接受IP包。(在机器没有多个网络硬件界面的情况下,如果您的操作系统支持,您可以使用 ifconfig alias
命令来达到这个目的)。
注意
<VirtualHost>
的使用并不影响Apache的监听地址。你需要使用Listen
来确保Apache正在监听正确的地址。
当使用基于IP的虚拟主机时,特殊的名称"_default_
"可以在没有匹配到其它列出的虚拟主机的情况下作为匹配任何IP地址的默认虚拟主机。在没有进行"_default_
"虚拟主机的设定时,在没有IP与请求匹配的情况下,将使用"主服务器"(在所有虚拟主机配置段之外)的配置。但请注意:任何匹配NameVirtualHost
指令的IP地址既不会使用"主服务器"配置,也不会使用"_default_
"虚拟主机的配置。参见基于域名的虚拟主机文档。
您可以指定一个":port
"来改变匹配的端口。如果没有指定,它将沿用主服务器中离它最近的那个Listen
指定的值。您也可以指定":*
"来匹配那个地址上的所有端口(当您使用"_default_
"时,这是推荐采用的方法)。
安全
参见安全提示文档以获得为什么当您存储日志文件的目录对于启动服务器以外的用户来说是可写的会危及服务器安全的详细资料。
参见
- Apache虚拟主机文档
- 关于DNS和Apache
- 设置Apache使用的地址和端口
- <Directory>、<Location>、<Files>配置段是如何工作的中包含了当接受一个请求时,这些不同的配置段是如何组合工作的相关解释。