Apache HTTP服务器V2.0

| 说明 | 接受附加路径名信息 |
|---|---|
| 语法 | AcceptPathInfo On|Off|Default |
| 默认值 | AcceptPathInfo Default |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | Apache2.0.30或更新版本 |
此指令决定了是否接受包含在某确定文件(或是某现有目录的一个不存在的文件)后附加的路径信息。此路径信息将在脚本里以PATH_INFO环境变量的形式出现。
比如说,假设"/test/"所指向的目录下只包括一个文件:here.html,那么对"/test/here.html/more"和"/test/nothere.html/more"的请求都会得到"/more"这样的PATH_INFO变量。
AcceptPathInfo 指令的三个参数为:
OffOnDefaultAcceptPathInfo指令存在的首要目的就是允许您覆盖处理器关于是否接受PATH_INFO的默认设置。这种覆盖是很必要的。比如说,当您使用了类似INCLUDES这样的过滤器来根据PATH_INFO产生内容时。核心处理器通常会拒绝这样的请求,而您就可以用下述的配置使这样的脚本成为可能:
<Files "mypaths.shtml">
Options +Includes
SetOutputFilter INCLUDES
AcceptPathInfo On
</Files>
| 说明 | 分布式配置文件名 |
|---|---|
| 语法 | AccessFileName filename [filename] ... |
| 默认值 | AccessFileName .htaccess |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
当向客户端返回文档时,如果设置了此目录的分布式配置文件功能。服务器将在这个文档的各个路径中从名字列表中查找第一个存在的配置文件。比如说:
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时,在HTTP应答头中加入的默认字符集 |
|---|---|
| 语法 | AddDefaultCharset On|Off|charset |
| 默认值 | AddDefaultCharset Off |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
当且仅当应答内容是text/plain或text/html时,此指令将会在HTTP应答头中加入的默认字符集。这将覆盖在文档体中通过<meta>标签指定的字符集。AddDefaultCharset Off
这样的设置将会禁用此功能。AddDefaultCharset On 将根据此指令的需要启用Apache内部的默认字符集iso-8859-1。您也可以指定使用在IANA注册过的字符集名字中的另外一个字符集。比如说:
AddDefaultCharset utf-8
AddDefaultCharset 只应当在如下情况下使用:所有文本资源都使用同一种确定的字符集,且分别标记他们的字符集非常麻烦。注意,设置了默认的字符集以后将会使得浏览器的字符集自动探测功能失效。
| 说明 | 对特定的MIME类型指定输出过滤器 |
|---|---|
| 语法 | AddOutputFilterByType filter[;filter...]
MIME-type [MIME-type] ... |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | Apache2.0.33及后继版本 |
此指令根据应答的MIME类型对请求激活特定的输出过滤器。
下例使用了由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脚本中设定内容类型也很妥当。
由类型决定的输出过滤器永远不会作用于来自代理的请求。
| 说明 | 确定是否允许URL中使用经过编码的路径分割符 |
|---|---|
| 语法 | AllowEncodedSlashes On|Off |
| 默认值 | AllowEncodedSlashes Off |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
| 兼容性 | Apache 2.0.46及以后版本 |
AllowEncodedSlashes 指令允许使用包含经过编码的路径分割符的URL("%2F"→"/"或"%5C"→"\",取决于不同的系统)。默认情况下,这些URL将被一个包含"404 (Not found)"错误的应答拒绝。
"AllowEncodedSlashes On"通常和PATH_INFO配合使用。
允许在URL中使用经过编码的斜线(路径分割符)并不意味着解码。%2F或%5C(取决于不同的系统)将会按原样出现在经过解码的URL字符串中。
| 说明 | 允许存在于.htaccess文件中的指令类型 |
|---|---|
| 语法 | AllowOverride All|None|directive-type
[directive-type] ... |
| 默认值 | AllowOverride All |
| 作用域 | directory |
| 状态 | Core |
| 模块 | core |
当服务器发现了一个.htaccess文件(由AccessFileName指定)时,它需要知道在这个文件中声明的哪些指令能覆盖在此之前指定的配置指令。
AllowOverride 仅在<Directory>配置段中才是有效的。在<Location>, <DirectoryMatch>或<Files>配置段中都是无效的。如果此指令设置为"None",那么.htaccess文件将被完全忽略。在这种情况下,服务器甚至都不会读取.htaccess文件。
当此指令设置为"All"时,所有具有.htaccess作用域的指令都允许出现在.htaccess文件中。
directive-type 可以是下列各组指令之一:
AuthDBMGroupFile,
AuthDBMUserFile,
AuthGroupFile,
AuthName,
AuthType, AuthUserFile, Require, 等).DefaultType, ErrorDocument, ForceType, LanguagePriority,
SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove*
指令, 等).AddDescription,
AddIcon, AddIconByEncoding,
AddIconByType,
DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName,
等).Allow, Deny和Order).Options和XBitHack).例如以下指令只允许AuthConfig和Indexes组的指令:
AllowOverride AuthConfig Indexes
| 说明 | 用于HTTP认证的验证域 |
|---|---|
| 语法 | AuthName auth-domain |
| 作用域 | directory, .htaccess |
| 覆盖项 | AuthConfig |
| 状态 | Core |
| 模块 | core |
此指令为目录的验证域设置了名字。此域将发送给客户端以使用户了解应当发送哪个用户名和密码。AuthName指令带有一个参数。如果域的名字中包含空格,它必须用引号引起来。它必须与AuthType和Require指令以及诸如AuthUserFile和AuthGroupFile这样的指令一起工作。
举例如下:
AuthName "Top Secret"
提供给AuthName的字符串将出现在大多数浏览器提供的密码对话框中。
| 说明 | 用户验证的类型 |
|---|---|
| 语法 | AuthType Basic|Digest |
| 作用域 | directory, .htaccess |
| 覆盖项 | AuthConfig |
| 状态 | Core |
| 模块 | core |
此指令选择了一个目录的用户验证的类型。目前只实现了Basic和Digest。它必须和AuthName和Require指令以及诸如AuthUserFile和AuthGroupFile这样的指令一起使用。
| 说明 | 定位CGI脚本解释器 |
|---|---|
| 语法 | CGIMapExtension cgi-path .extension |
| 作用域 | directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | 仅适用于NetWare |
此指令用于控制Apache发现CGI脚本的解释器。比如说"CGIMapExtension sys:\foo.nlm .foo"这样的设置将把所有具有".foo"扩展名的CGI脚本文件传递给FOO解释器。
| 说明 | 启用Content-MD5应答头的生成 |
|---|---|
| 语法 | ContentDigest On|Off |
| 默认值 | ContentDigest Off |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | Options |
| 状态 | Core |
| 模块 | core |
此指令遵照RFC1854和RFC2068协议定义启用了Content-MD5应答头的生成。
MD5是一种为不定长度(arbitrary-length)的数据计算出一个"消息摘要"(有时也称为"指纹")的算法。并且保证数据中的任何变化都会反应在消息摘要的变化当中。
Content-MD5头提供了一种端到端的针对整个消息体的完整性检测方法。代理或者客户端会检查此头以侦测在传输过程中,消息体是否产生了意外的改变。一个头的例子如下:
Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==
请注意,因为对于每个请求都要进行消息摘要的运算(没有对其值进行缓存),所以这会对您的服务器造成性能方面的问题。
Content-MD5仅为由核心伺服的文档进行发送,而对于模块将不予理会。比如说SSI文档,CGI脚本的输出和字节范围的应答都不包括这个头。
| 说明 | 在服务器无法由其他方法确定类型时,发送的默认MIME内容类型 |
|---|---|
| 语法 | DefaultType MIME-type |
| 默认值 | DefaultType text/plain |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
有时会发生这样的事:服务器会被要求提供一个文档,而这个文档的类型无法由它的MIME类型映射所决定。
服务器必须通知客户端其文档的内容类型。所以当一个未知类型出现时,将会使用DefaultType。比如说:
DefaultType image/gif
这样的配置对于里面有很多gif图片而有些在文件名中缺少".gif"扩展名的目录非常合适。
注意:与ForceType指令的不同之处在于:此指令仅提供了默认的mime类型。所有其它mime类型的定义,包括文件的扩展名,或那些可以标识一种媒体类型的都会覆盖此默认值。
| 说明 | 封装一组指令,使之仅对某个目录及其子目录生效 |
|---|---|
| 语法 | <Directory directory-path>
... </Directory> |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | 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/web)。/home/.htaccess, /home/web/.htaccess和/home/web/dir/.htaccess中的FileInfo组指令。正则表达式将在所有普通配置段应用后才予以考虑。所有的正则表达式将根据它们出现在配置文件中的顺序进行验证。比如说,以下配置:
<Directory ~ abc$>
# ... directives here ...
</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>配置段中。
| 说明 | 封装一些指令并作用于文件系统中符合一个正则表达式的目录及其子目录 |
|---|---|
| 语法 | <DirectoryMatch regex>
... </DirectoryMatch> |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
<DirectoryMatch>和</DirectoryMatch>用于封装一组指令。与<Directory>类似,此指令将仅作用于指定名字的目录及其子目录。然而,它可以接受一个正则表达式作为参数。比如说:
<DirectoryMatch "^/www/(.+/)?[0-9]{3}">
将匹配"/www/"下所有由3个数字组成的目录。
<Directory> 获取如何在普通的<Directory>中使用正则表达式的描述。| 说明 | 组成网络上可以观看的主文档树的目录 |
|---|---|
| 语法 | DocumentRoot directory-path |
| 默认值 | DocumentRoot /usr/local/apache/htdocs |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
此指令设置了httpd伺服的目录。在没有使用类似Alias这样的指令的情况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。比如说:
DocumentRoot /usr/web
于是对于http://www.my.host.com/index.html 的访问就会指向/usr/web/index.html
指定DocumentRoot时不应包括最后的"/"。
| 说明 | 在递送中使用内存映射(memory-mapping)来读取文件 |
|---|---|
| 语法 | EnableMMAP On|Off |
| 默认值 | EnableMMAP On |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
此指令控制着httpd在递送中如果需要读取一个文件的内容,它是否可以使用内存映射。当处理一个需要访问在一个文件中的数据的请求时,比如说当递送一个使用mod_include指令进行服务器端分析的文件时,如果操作系统支持,Apache将默认使用内存映射。
这种内存映射有时会带来性能的提高,但在某些情况下,您可能会需要禁用内存映射以避免一些操作系统的问题:
DocumentRoot上,当httpd已经将一个文件进行了内存映射的情况下,删除或截断了这个文件会造成httpd因为分段故障而崩溃。在可能遇到这些问题的服务器配置过程中,您应当使用下面这样的命令来禁用内存映射:
EnableMMAP Off
对于NFS的挂载文件夹,可以单独指定禁用内存映射:
<Directory "/path-to-nfs-files">
EnableMMAP Off
</Directory>
| 说明 | 使用操作系统内核的sendfile支持来将文件发送到客户端 |
|---|---|
| 语法 | EnableSendfile On|Off |
| 默认值 | EnableSendfile On |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | 2.0.44及以后版本 |
这个指令控制httpd是否可以使用操作系统内核的sendfile支持来将文件发送到客户端。默认情况下,当处理一个请求并不需要访问文件内部的数据时(比如发送一个静态的文件内容),如果操作系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件。
这个sendfile机制避免了分开的读和写操作以及缓冲区分配,但是在一些平台或者一些文件系统上,最好禁止这个特性来避免一些问题:
DocumentRoot (比如:NFS或SMB),内核可能无法可靠的通过自己的cache服务于网络文件。如果出现以上情况,你应当使用"EnableSendfile off"来禁用sendfile:
EnableSendfile Off
针对NFS或SMB,这个指令可以被针对目录的设置覆盖:
<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>
| 说明 | 当遇到错误的时候服务器将给客户端什么样的应答 |
|---|---|
| 语法 | ErrorDocument error-code document |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | 在Apache2.0中引用文字的语法有了不同 |
当遇到问题或错误的时候,Apache能被配置为进行以下四种处理之一:
默认会采取第一种方法,而第2-4种方法可以使用ErrorDocument指令后面跟随一个HTTP应答代码和一个URL或信息来进行配置。Apache有时会额外提供一些信息来描述所发生的问题/错误。
URL可以由一个斜杠(/)开头来指示一个本地的URL,或是提供一个能被客户端解释的完整的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中获取更多信息。
在2.0版以前,信息前面会加以单个的双引号字符。
| 说明 | 定位存放错误日志的位置 |
|---|---|
| 语法 | ErrorLog file-path|syslog[:facility] |
| 默认值 | ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows and OS/2) |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | 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平台上输入文件路径的时候,路径分隔符必须统一使用正斜线(/),即使那个平台本身使用反斜线(\)。
| 说明 | 用以创建ETag应答头的文件的属性 |
|---|---|
| 语法 | FileETag component ... |
| 默认值 | FileETag INode MTime Size |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
FileETag指令配置了当文档是基于一个文件时用以创建Etag(实体标签)应答头域的文件的属性。(ETag的值用于进行缓冲管理以节约网络带宽。)在Apache1.3.22及以前,ETag的值总是由文件的索引节,大小和最后修改时间(mtime)决定。FileETag指令可以让您选择(如果您想进行选择)这其中哪些要素将被使用。主要关键字如下:
FileETag INode MTime Size
INode,MTime和Size关键字可以加上"+"或"-"前缀,用以改变由更上层继承下来的默认值。任何没有上述前缀的关键字将立刻完全取消继承下来的设置。
如果一个目录的配置包含了"FileETag INode MTime Size"而其一个子目录包含了"FileETag -INode"那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于"FileETag MTime Size"。
| 说明 | 包含将作用于匹配指定文件名的指令 |
|---|---|
| 语法 | <Files filename> ... </Files> |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
<Files>指令提供了基于文件名的访问控制。它相对于<Directory>和<Location>指令。它将匹配一个</Files>指令。在此配置段中定义的指令将赋予基本名称(不是完整的路径)与指定的文件名相符的对象。<Files>配置段将根据它们在配置文件中出现的顺序被处理:在<Directory>配置段和.htaccess文件被读入之后,但在<Location>配置段之前。请注意:<Files>能嵌入到<Directory>配置段中以限制它们被赋予的文件系统部分。
filename 参数应当包括一个文件名或是一个通配符字串,其中"?"匹配任何单个字符,"*"匹配任何字串序列。扩展正则表达式也同样可以在使用了"~"字符后被使用。比如:
<Files ~ "\.(gif|jpe?g|png)$">
将匹配绝大部分常见的因特网图象格式。然而在Apache1.3及其后继版本中,更推荐使用<FilesMatch>指令。
请注意与<Directory>和<Location>配置段不同的是:<Files>配置段可用于.htaccess文件当中。这将允许用户在文件和文件之间的层面上控制对它们自己文件的访问。
| 说明 | 包含作用于匹配正则表达式的文件名的指令 |
|---|---|
| 语法 | <FilesMatch regex> ... </FilesMatch> |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
<FilesMatch>指令就像<Files>指令一样提供了针对文件名的访问控制。然而,它可以使用正则表达式。比如说:
<FilesMatch "\.(gif|jpe?g|png)$">
将匹配最常见的internet图形文件格式。
| 说明 | 强制所有匹配的文件被作为指定的MIME类型进行伺服 |
|---|---|
| 语法 | ForceType MIME-type|None |
| 作用域 | directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | Moved to the core in 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>
| 说明 | 启用对客户端IP的DNS查找 |
|---|---|
| 语法 | HostnameLookups On|Off|Double |
| 默认值 | HostnameLookups Off |
| 作用域 | server config, virtual host, directory |
| 状态 | Core |
| 模块 | core |
此指令启用了DNS查询,使得主机名能被记入日志(并用REMOTE_HOST参数传递给CGI/SSI)。参数Double指定进行一次双向DNS。也就是说在一次反向查询之后,再对返回的结果进行一次正向查询。在正向查询结果中至少应该有一个ip地址与初始的地址相符。(在"tcpwrappers"中的术语是PARANOID)
不论如何设置,当您使用mod_access来控制根据主机名的访问的时候,就会执行一次双向查询。这对安全来说非常必要。请注意如果您没有设置"HostnameLookups Double",这种双向查询的结果不是自动生成的。比如说:如果仅仅设置了"HostnameLookups On"而且请求是针对一个根据主机名做了限制的对象,不论双向查询是否失败,CGI还是会把单向查询的结果用REMOTE_HOST来传送。
默认值设置为"off"是为了那些不需要进行反向查询的站点节约网络带宽考虑的。这对最终用户也是有益的,因为这样他们就不用忍受查询造成的延迟了。高访问量的网站应该将此指令设置为"off"因为DNS查询会造成明显的时间消耗。在/support目录下的logresolve工具可以在离线的情况下对已经记入日志的IP地址进行主机名的查询。
| 说明 | 启用对远端用户的RFC1413身份鉴定的日志 |
|---|---|
| 语法 | IdentityCheck On|Off |
| 默认值 | IdentityCheck Off |
| 作用域 | server config, virtual host, directory |
| 状态 | Core |
| 模块 | core |
当客户端机器运行了identd或类似程序时,此指令为每个链接记录RFC1413兼容的远端用户名。这些信息将记入访问日志中。
此信息除了用于基本的跟踪以外是不应该多加信任的。
请注意因为对每个请求都会进行这样的查询,所以这样设置有可能会使您的服务器访问出现严重的延迟。当涉及到防火墙的时候,每次查询都会因为可能的失败而对每次点击增加30秒的延迟。所以一般来说对于公网上的服务器这个指令并不是很有用。
| 说明 | 封装一组只有在启动时当test结果为真时才生效的指令 |
|---|---|
| 语法 | <IfDefine [!]parameter-name> ...
</IfDefine> |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
<IfDefine test>...</IfDefine>配置段用于标识有条件的指令。<IfDefine>配置段中的指令仅当test结果为真时才进行处理。如果测试失败。此配置段中的指令将会被忽略。
<IfDefine>配置段中的test可以为以下两种形式之一:
!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 [!]module-name> ...
</IfModule> |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
<IfModule test>...</IfModule>配置段用于标识根据指定模块的存在与否而决定是否进行处理的指令。在<IfModule>配置段中的指令仅当test 为真的时候才进行处理。如果测试失败,所有其间的指令都将忽略。
<IfModule>段中的test可以为以下两种方式之一:
在第一种情况下,起始和结束标记之间的指令仅当符合module
name的模块载入后才被执行。此模块可以为编译时加入静态链接模块或是使用LoadModule指令动态载入的模块。第二种情况是相反的。仅当module name没有载入时才进行指令的处理。
module name参数是在模块编译时模块的文件名。比如说:mod_rewrite.c。如果模块包含多个源代码文件,您应当使用包含STANDARD20_MODULE_STUFF的那个。
<IfModule>配置段是可以嵌套的,从而可以实现简单的多模块测试。比如说:
<IfModule>配置段中。| 说明 | 在服务器配置文件中包含其它配置文件 |
|---|---|
| 语法 | Include file-path|directory-path |
| 作用域 | server config, virtual host, directory |
| 状态 | Core |
| 模块 | core |
| 兼容性 | 通配符匹配在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
| 说明 | 启用HTTP持久链接 |
|---|---|
| 语法 | KeepAlive On|Off |
| 默认值 | KeepAlive On |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | 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 seconds |
| 默认值 | KeepAliveTimeout 15 |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
Apache在关闭连接前等待下一个请求的时间间隔。一旦收到一个请求,超时值将会被设置为Timeout指令指定的值。
对于高负荷的服务器来说,KeepAliveTimeout设置为一个比较大的值会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。
| 说明 | 限定访问控制仅作用于某些特定的HTTP方法 |
|---|---|
| 语法 | <Limit method [method] ... > ...
</Limit> |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | 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方法不能被限制。
| 说明 | 对除了指定方法以外的所有HTTP方法进行访问控制 |
|---|---|
| 语法 | <LimitExcept method [method] ... > ...
</LimitExcept> |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
<LimitExcept>和</LimitExcept>用于封装一组访问控制指令,并将其作用于所有未在参数中标出的HTTP方法。也就是说,与<Limit>相反,它用于控制标准的和非标准以及无法辨识的方法。
比如:
<LimitExcept POST GET>
Require valid-user
</LimitExcept>
| 说明 | 指定内部重定向和嵌套子请求的最大数量 |
|---|---|
| 语法 | LimitInternalRecursion number [number] |
| 默认值 | LimitInternalRecursion 10 |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
| 兼容性 | Apache 2.0.47 及以后版本 |
例如,当使用Action指令内部重定向原始请求到一个CGI脚本时,一个内部重定向将会发生。子请求是Apache的一个用于找到如果一个URI被请求时将会发生什么的机制。例如,mod_dir使用子请求来寻找那些根据DirectoryIndex指令应当被列出的文件。
LimitInternalRecursion 可以防止服务器进入一个内部重定向或者子请求的死循环而崩溃。这样的死循环通常由错误的配置引起。
这个指令存储了两个不同的限制,这两个限制是基于每个单独的请求进行计算的。第一个number限制了内部重定向链的最大长度(一个接一个)。第二个number限制了子请求最大嵌套层数。如果你只指定了一个number,那么将会被同时应用于两个限制。
LimitInternalRecursion 5
| 说明 | 限制客户端发送的HTTP请求体的最大字节长度 |
|---|---|
| 语法 | LimitRequestBody bytes |
| 默认值 | LimitRequestBody 0 |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
此指令在0(意味着无限制)到2147483647(2GB)间限制了请求体所允许的字节数。
LimitRequestBody可以让用户在其作用范围内(整个服务器、特定目录、特定文件或特定位置)设置一个允许客户端发送的HTTP请求体的最大字节长度的限制。如果客户端的请求超出了这个限制,服务器会回应一个错误而不是伺服这个请求。一个普通请求的信息体在很大程度上取决于资源的自然属性和这个资源允许的方法。CGI脚本经常用消息体把表单的信息传递给服务器。使用PUT方法至少会需要与服务器期望从这个资源得到的信息量差不多大小的值。
此指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。
比如,如果您允许文件上传到某个位置,而且希望能将上传文件的大小设置为100K,您可以使用下面的指令:
LimitRequestBody 102400
| 说明 | 限制接受客户端请求中HTTP请求头域的数量 |
|---|---|
| 语法 | LimitRequestFields number |
| 默认值 | LimitRequestFields 100 |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
Number 是一个0(意味着不限)到32767之间的整数。默认值为编译时的常量DEFAULT_LIMIT_REQUEST_FIELDS (发布值为100)。
LimitRequestFields指令允许服务器管理员修改在一个HTTP请求中的请求头域的数量限制。服务器需要此值大于一个普通客户端请求中包含头域的数量。一个客户端请求头域的数量很少大于20,但根据客户端的不同这个数字有很大的差别,经常取决于用户配置他们的浏览器扩展以支持更详细的内容协商。可选的HTTP扩展经常使用请求头域来实现。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。如果正常使用的客户端得到了服务器的错误应答,指出其在请求中发送了过多的头域,您应该适当的增大此值。
举例如下:
LimitRequestFields 50
| 说明 | 限制客户端发送的请求头的字节数 |
|---|---|
| 语法 | LimitRequestFieldsize bytes |
| 默认值 | LimitRequestFieldsize 8190 |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
这个指令指定了HTTP请求头允许的大小。bytes的取值范围为0到编译时常量DEFAULT_LIMIT_REQUEST_FIELDSIZE(发布值为8190 )之间。
LimitRequestFieldSize指令允许服务器管理员在服务器编译时设定的输入缓冲大小的范围之下降低关于HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有着很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。
举例如下:
LimitRequestFieldSize 4094
| 说明 | 限制接受客户端发送的HTTP请求行的字节数 |
|---|---|
| 语法 | LimitRequestLine bytes |
| 默认值 | LimitRequestLine 8190 |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
这个指令将设置HTTP请求行的字节数限制。bytes的范围在0到编译时常量DEFAULT_LIMIT_REQUEST_LINE(发布值为8190)之间。
LimitRequestLine指令允许服务器管理员在服务器编译时设定的输入缓冲大小的范围之下降低客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI和协议版本,所以LimitRequestLine指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在GET请求中所传递的查询部分的所有信息。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。
举例如下:
LimitRequestLine 4094
| 说明 | 限制基于XML的请求体的大小 |
|---|---|
| 语法 | LimitXMLRequestBody bytes |
| 默认值 | LimitXMLRequestBody 1000000 |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
限制基于XML的请求体大小的最大值(以字节为单位),0将禁用这一检查。
比如:
LimitXMLRequestBody 0
| 说明 | 将封装的指令作用于匹配的URL |
|---|---|
| 语法 | <Location
URL-path|URL> ... </Location> |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | 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>将匹配请求"URL/abc"但不会匹配请求"URL//abc"。而非正则表达式版本的<Location>指令在用于代理请求时,也有类似表现。但当非正则表达式版本的<Location>作用于非代理请求时,它会将多个毗邻的斜线认作单个斜线。比如,如果您指定了<Location /abc/def>而请求是指向"/abc//def"的,那么它们就是匹配的。
| 说明 | 将封装的指令作用于正则表达式匹配的URL |
|---|---|
| 语法 | <LocationMatch
regex> ... </LocationMatch> |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
<LocationMatch>与<Location>指令相同,提供了基于URL的访问控制。但它使用正则表达式作为参数,而不是简单字符串。比如:
<LocationMatch "/(extra|special)/data">
将匹配包含子串"/extra/data"或"/special/data"的URL。
| 说明 | 控制错误日志的详细程度 |
|---|---|
| 语法 | LogLevel level |
| 默认值 | LogLevel warn |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
LogLevel用于调整记录在错误日志中的信息的详细程度。(参见ErrorLog指令)。可以选择下列级别,依照重要性降序排列:
| 等级 | 描述 | 例子 |
|---|---|---|
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 number |
| 默认值 | MaxKeepAliveRequests 100 |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。
示例如下:
MaxKeepAliveRequests 500
| 说明 | 为一个基于域名的虚拟主机指定一个IP地址 |
|---|---|
| 语法 | NameVirtualHost addr[:port] |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
如果您要配置基于域名的虚拟主机,NameVirtualHost指令就是您必须的指令之一。
尽管addr参数可以使用主机名,但建议您还是使用IP地址。比如:
NameVirtualHost 111.22.33.44
使用NameVirtualHost指令,您可以指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。在一个防火墙或是其它代理接受了请求并把它转到服务器所在的另外一个IP地址上的情况下,您必须指定伺服请求的机器物理界面上的IP地址。如果您对于多个地址使用了多个基于域名的虚拟主机,您应该为每个地址使用这个指令。
"主服务器"和任何其它默认服务器都不会伺服发送到NameVirtualHostIP地址的请求。(除非您指定了NameVirtualHost,但没有为这个地址指定任何VirtualHost)。
另外,您还可以为您使用的基于域名的虚拟主机指定一个端口号。比如:
NameVirtualHost 111.22.33.44:8080
IPv6地址必须封装在一对方括号内,如下例所示:
NameVirtualHost [fe80::a00:20ff:fea7:ccea]:8080
为了接受所有界面的请求,您可以使用参数"*"
NameVirtualHost *
<VirtualHost>指令的参数请注意,<VirtualHost>指令的参数必须与NameVirtualHost指令的参数完全匹配。
NameVirtualHost 1.2.3.4
<VirtualHost 1.2.3.4>
# ...
</VirtualHost>
| 说明 | 配置在特定目录中可以使用哪些特性 |
|---|---|
| 语法 | Options
[+|-]option [[+|-]option] ... |
| 默认值 | Options All |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | Options |
| 状态 | Core |
| 模块 | core |
Options指令控制了在特定目录中将使用哪些服务器特性。
option 可以设置为None,在这种情况下,将不启用任何额外特性。或设置为以下选项中的一个或多个:
AllMultiViews之外的所有特性。这是默认设置。ExecCGImod_cgi执行CGI脚本。FollowSymLinks注意:即使服务器会使用符号连接,但它不会改变用于匹配<Directory>配置段的路径名。
注意:如果此配置位于<Location>配置段中,则此设置会被忽略。
Includesmod_include提供的服务器端包含。IncludesNOEXEC#exec
cmd"和"#exec cgi"。但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。IndexesDirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表。MultiViewsmod_negotiation提供的内容协商的"多重视图"。SymLinksIfOwnerMatch<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 entity-name [entity-name] ... |
| 作用域 | directory, .htaccess |
| 覆盖项 | AuthConfig |
| 状态 | Core |
| 模块 | core |
这个指令选择那个认证用户能访问一个资源。其语法如下:
Require user userid [userid]
...Require group group-name [group-name]
...Require valid-userRequire必须伴随AuthName和AuthType指令,以及诸如AuthUserFile和AuthGroupFile(用以定义用户和用户组)以确保其能够正确工作。例如:
AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /web/users
AuthGroupFile /web/groups
Require group admin
使用这种方法提供的访问控制对所有方法都有效。这是一般情况下期望达到的效果。如果您仅希望对某个特定的方法加以限制,而不涉及其它方法时,您可以将Require语句放入<Limit>配置段中。
| 说明 | 限制Apache子进程衍生的进程占用CPU的秒数 |
|---|---|
| 语法 | RLimitCPU seconds|max [seconds|max] |
| 默认值 | 未定义,使用操作系统默认值 |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root运行服务器或是在初始化启动语句中进行设置。
这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。
CPU资源限制表示为每进程占用的秒数。
| 说明 | 限制由Apache子进程衍生的进程占用的最大内存字节数 |
|---|---|
| 语法 | RLimitMEM bytes|max [bytes|max] |
| 默认值 | 未定义,使用操作系统默认值 |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root运行服务器或是在初始化启动语句中进行设置。
这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。
内存资源限制表示为每进程占用的字节数。
| 说明 | 限制由Apache子进程衍生的进程所衍生的进程数目 |
|---|---|
| 语法 | RLimitNPROC number|max [number|max] |
| 默认值 | 未定义,使用操作系统默认值 |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
使用一个或两个参数。第一个参数设置了所有进程的软资源限制,第二个参数设置了最大资源限制。两个参数均可设置为一个数值或是"max"以表示设置为操作系统允许的最大值。增大此资源限制最大值需要以root运行服务器或是在初始化启动语句中进行设置。
这个限制将作用于Apache子进程服务的请求所衍生出的进程,而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令,但不包括所有从Apache父进程衍生出的进程。比如管道日志。
进程限制控制了每个用户的进程数。
error_log中以cannot fork进行记录。| 说明 | 主机级别的访问控制和用户认证之间的相互关系 |
|---|---|
| 语法 | Satisfy Any|All |
| 默认值 | Satisfy All |
| 作用域 | directory, .htaccess |
| 覆盖项 | AuthConfig |
| 状态 | Core |
| 模块 | 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>配置段指定的特定的方法。
| 说明 | 定位CGI脚本解释器 |
|---|---|
| 语法 | ScriptInterpreterSource Registry|Registry-Strict|Script |
| 默认值 | ScriptInterpreterSource Script |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
| 兼容性 | 仅用于Win32 |
这个指令用于控制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 email-address |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | core |
ServerAdmin设置了在所有返回给客户端的错误信息中包含的管理员邮件地址。
您为这个目的专门设置一个邮箱是值得的比如:
ServerAdmin www-admin@foo.example.com
因为用户一般不会注意到他们在讨论服务器的问题!
| 说明 | 匹配一个基于域名的虚拟主机的别名 |
|---|---|
| 语法 | ServerAlias hostname [hostname] ... |
| 作用域 | virtual host |
| 状态 | Core |
| 模块 | core |
ServerAlias指令与基于域名的虚拟主机联用,设定主机的别名。
<VirtualHost *>
ServerName server.domain.com
ServerAlias server server2.domain.com server2
# ...
</VirtualHost>
| 说明 | 服务器用于辨识自己的主机名和端口号 |
|---|---|
| 语法 | ServerName fully-qualified-domain-name[:port] |
| 作用域 | server config, virtual host |
| 状态 | Core |
| 模块 | 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指令以获得关于自引用(self-referential)URL(比如使用mod_dir模块)是需要指定一个特定端口,还是使用客户端请求的端口号的更详细的信息。
| 说明 | 为兼容性不好的浏览器访问基于域名的虚拟主机保留的URL路径名 |
|---|---|
| 语法 | ServerPath URL-path |
| 作用域 | virtual host |
| 状态 | Core |
| 模块 | core |
ServerPath指令为主机设置了保守的(legacy)URL路径名,用于和基于域名的虚拟主机配合使用。
| 说明 | 服务器安装基础目录 |
|---|---|
| 语法 | ServerRoot directory-path |
| 默认值 | ServerRoot /usr/local/apache |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
ServerRoot指令设置了服务器存在的目录。一般来说它将包含"conf"和"logs"子目录。其它配置文件的相对路径即基于此目录 (比如:Include或LoadModule)。
ServerRoot /home/httpd
httpd的"-d"选项ServerRoot权限的部分| 说明 | 配置服务器生成页面的页脚 |
|---|---|
| 语法 | ServerSignature On|Off|EMail |
| 默认值 | ServerSignature Off |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | All |
| 状态 | Core |
| 模块 | core |
ServerSignature指令允许您配置服务器端生成文档的页脚(错误信息、mod_proxy的ftp目录列表、mod_info的输出)。您启用这个页脚的原因主要在于处于一个代理服务器链中的时候,用户基本无法辨识出究竟是链中的哪个服务器真正产生了返回的错误信息。
默认的"Off"设置没有错误行(这样便与Apache1.2及更旧版本兼容)。采用"On"会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName,而"EMail"设置会如文档中说明的那样额外创建一个指向ServerAdmin的"mailto:"部分。
对于2.0.44以后的版本,显示的详细服务器版本号将由ServerTokens指令控制。
| 说明 | 配置服务器HTTP应答头 |
|---|---|
| 语法 | ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full |
| 默认值 | ServerTokens Full |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
这个指令控制了服务器回应给客户端的应答头是否包含关于服务器操作系统类型和编译进的模块描述信息。
ServerTokens Prod[uctOnly]Server:
ApacheServerTokens MajorServer:
Apache/2ServerTokens MinorServer:
Apache/2.0ServerTokens Min[imal]Server:
Apache/2.0.41ServerTokens OSServer: 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 handler-name|None |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | 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指令。
| 说明 | 设置处理客户端请求和POST输入时使用的过滤器 |
|---|---|
| 语法 | SetInputFilter filter[;filter...] |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
SetInputFilter指令为服务器接受并处理客户端请求和POST输入设置了过滤器。这是在其它地方(包括AddInputFilter指令)设置的过滤器的以外附加的过滤器。
如果设置了多于一个的过滤器,它们必须按照处理内容的顺序用分号(;)分隔。
| 说明 | 设置用于处理服务器输出应答的过滤器 |
|---|---|
| 语法 | SetOutputFilter filter[;filter...] |
| 作用域 | server config, virtual host, directory, .htaccess |
| 覆盖项 | FileInfo |
| 状态 | Core |
| 模块 | core |
SetOutputFilter指令设置了用于在服务器应答发送到客户端之前使用的过滤器。这是在其它地方(包括AddInputFilter指令)设置的过滤器的以外附加的过滤器。
例如:下述配置将会把"/www/data/"目录下的所有文件作为SSI文件来处理。
<Directory /www/data/>
SetOutputFilter INCLUDES
</Directory>
如果设置了多于一个的过滤器,它们必须按照处理内容的顺序用分号(;)分隔。
| 说明 | 对于某些事件,服务器在断定请求失败前等待的时间 |
|---|---|
| 语法 | TimeOut seconds |
| 默认值 | TimeOut 300 |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
TimeOut指令用于设置Apache等待以下三种事件的时间长度:
我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。
| 说明 | 配置服务器如何决定它自己的域名和端口 |
|---|---|
| 语法 | UseCanonicalName On|Off|DNS |
| 默认值 | UseCanonicalName On |
| 作用域 | server config, virtual host, directory |
| 状态 | Core |
| 模块 | 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,它们会工作的很好。
| 说明 | 包含仅作用于指定主机名或IP地址的指令 |
|---|---|
| 语法 | <VirtualHost
addr[:port] [addr[:port]]
...> ... </VirtualHost> |
| 作用域 | server config |
| 状态 | Core |
| 模块 | core |
<VirtualHost>和</VirtualHost>用于封装一组仅作用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在<VirtualHost>配置段中的指令。Addr 可以是:
NameVirtualHost *"配合使用以匹配所有的IP地址_default_",与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址。
<VirtualHost 10.1.2.3>
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>
IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。一个IPv6的示例如下:
<VirtualHost [fe80::a00:20ff:fea7:ccea]>
ServerAdmin webmaster@host.example.com
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
</VirtualHost>
每个虚拟主机必须对应不同的IP地址、端口号或是不同的主机名。在第一种情况下,服务器所在的物理机器必须配置为可以为多个IP地址接受IP包。(在机器没有多个网络硬件界面的情况下,如果您的操作系统支持,您可以使用"ifconfig alias"命令来达到这个目的)。
<VirtualHost>的使用并不影响Apache的监听地址。你可能需要使用Listen来确保Apache正在监听正确的地址。
当使用基于IP的虚拟主机时,特殊的名称"_default_"可以在没有匹配到其它列出的虚拟主机的情况下作为匹配任何IP地址的默认虚拟主机。在没有进行"_default_"虚拟主机的设定时,在没有IP与请求匹配的情况下,将使用"主服务器"(在所有虚拟主机配置段之外)的配置。但请注意:任何匹配NameVirtualHost指令的IP地址既不会使用"主服务器"配置,也不会使用"_default_"虚拟主机的配置。参见基于域名的虚拟主机文档获得更多详情。
您可以指定一个":port"来改变匹配的端口。如果没有指定,它将沿用主服务器中离它最近的那个Listen指定的值。您也可以指定":*"来匹配那个地址上的所有端口(当您使用_default_时,这是推荐采用的方法)。
参见安全提示文档以获得为什么当您存储日志文件的目录对于启动服务器以外的用户来说是可写的会危及服务器安全的详细资料。