定义变量
Define
描述: 定义变量
语法: Define parameter-name [parameter-value]
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段
状态: Core
模块: Core
如果给出第二个参数,则将变量设置为该值,可以使用 ${VAR}
语法在配置中使用该变量。
在只有一个参数的形式中,它只能被用于<ifDefine>
或者<unDefine>
片段中,当然有第二个参数的形式也能被用于<ifDefine>
或者<unDefine>
片段中。
<IfDefine TEST>
Define servername test.example.com
</IfDefine>
<IfDefine !TEST>
Define servername www.example.com
Define SSL
</IfDefine>
DocumentRoot "/var/www/${servername}/htdocs"
注意: 变量始终是全局定义的,不限于周围配置的范围。虽然此指令可以用在<VirtualHost>
和<Directory>
片段中,但它所做的更改对任何后续配置指令都是可见的,作用范围会超出<VirtualHost>
和<Directory>
片段。
监听接入请求
Listen
描述: 在指定地址和端口上监听接入请求
语法: Listen [IP-address:]portnumber [protocol]
语境: 系统配置文件
状态: MPM
模块: event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
Listen指令告诉服务器应该响应哪个端口或地址+端口的组合上的接入请求。如果仅指定端口号,则服务器将响应所有地址的给定端口上的接入请求;如果给出IP地址+端口的组合,服务器将响应给定的地址的给定端口上的接入请求;可以使用多个指令来指定服务器应该响应接入请求的多个地址和端口。
例如,要使服务器响应端口80和端口8000上的接入请求,请使用:
Listen 80
Listen 8000
要使服务器响应两个指定接口和端口号上的接入请求,请使用:
Listen 192.170.2.1:80
Listen 192.170.2.5:8000
IPv6地址必须用方括号括起来,如下例所示:
Listen [2001:db8::a00:20ff:fea7:ccea]:80
大多数配置不需要可选的协议参数。如果未指定,https则是端口443的缺省值,http是所有其他端口的缺省值。该协议用于确定哪个模块应该处理请求,以及应用AcceptFilter指令对协议配置的特定优化 。
如果您在非标准端口上运行,则需要设置协议。例如,https在端口8443上运行站点:
Listen 192.170.2.1:8443 https
Listen 现在是一个必需的指令。如果它不在配置文件中,则服务器将无法启动。<VirtualHost>
虚拟主机中使用的端口,必须通过Listen
进行监听才有效。
如何确定主机名和端口号
由ServerName
、UseCanonicalName
和UseCanonicalPhysicalPort
指令控制服务器如何确定自己的主机名和端口,从而构建自引用的URL。
例如,当客户端请求目录但在目录名称中不包含尾部斜杠时,httpd必须将客户端重定向到包括尾部斜杠的全名,以便客户端正确解析文档中的相对引用。
ServerName
描述: 配置标识自身的主机名和端口
语法: ServerName [scheme://]domain-name|ip-address[:port]
语境: 系统配置文件, <VirtualHost>
片段
状态: Core
模块: Core
设置服务器用于标识自身的请求方案,主机名和端口。服务器配置的 ServerName
是否生效,以及实际生效的 ServerName
值是什么,还要依赖于 UseCanonicalName 指令。
<VirtualHost>
片段中配置的 ServerName 还有另一个作用: 通过ServerName(可能结合 ServerAlias)来唯一地标识虚拟主机。客户端请求时优先指向host与ServerName(或者 ServerAlias)匹配的虚拟主机,都不匹配时,默认指向第一个<VirtualHost>
定义的虚拟主机。
ServerAlias
描述: 主机的备用名称
语法: ServerAlias hostname [hostname] …
位置: <VirtualHost>
片段
状态: Core
模块: Core
只能用在虚拟主机中,作为主机的备用名称来标识虚拟主机,支持使用合适的通配符
<VirtualHost *:80>
ServerName server.example.com
ServerAlias server server2.example.com server2
ServerAlias *.example.com
UseCanonicalName Off
# ...
</VirtualHost>
UseCanonicalName
描述: 配置服务器如何确定自己的名称和端口
语法: UseCanonicalName On|Off|DNS
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段
默认: UseCanonicalName Off
状态: Core
模块: Core
服务器名称和端口用于构造所有自引用URL 、SERVER_NAME以及SERVER_PORT,如何确定服务器的名称和端口有以下三种方式:
- 默认为 Off: Apache 将使用客户端提供的主机名和端口作为服务器的名称。
- On: Apache 将使用 ServerName 指令中指定的主机名和端口来作为服务器的名称。
- DNS: Apache 对客户端连接到的服务器IP地址执行反向DNS查找,以确定主机名。
UseCanonicalPhysicalPort
描述: 配置服务器如何确定自己的端口
语法: UseCanonicalPhysicalPort On|Off|DNS
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段
默认: UseCanonicalPhysicalPort Off
状态: Core
模块: Core
UseCanonicalPhysicalPort
设置为 On
,Apache将请求使用的实际物理端口号提供为潜在端口。
最终的端口号的确定受UseCanonicalPhysicalPort
指令和UseCanonicalName
指令的共同影响,查找顺序如下:
UseCanonicalName
On:- ServerName定义的端口
- 物理端口(仅当UseCanonicalPhysicalPort On时)
- 默认端口
UseCanonicalName
Off|DNS:- 从请求头字段
Host
中解析端口 - 物理端口(仅当UseCanonicalPhysicalPort On时)
- Servername定义的端口
- 默认端口
- 从请求头字段
指示返回哪些服务器信息
由ServerAdmin
、ServerTokens
和ServerSignature
指令控制哪些服务器的相关信息将在服务器生成的文档(如错误页面)中显示。
ServerAdmin
描述: 配置管理员的联系地址
语法: ServerAdmin email-address|URL
语境: 系统配置文件, <VirtualHost>
片段
状态: Core
模块: Core
服务器返回给客户端的错误信息(比如400页面、500页面,目录列表)中包含的管理员地址,旨在让用户在页面返回错误的情况下可以通过邮箱或url链接通知服务器管理员。管理员地址在默认的500错误页面以文本显示,在其他(包括500错误页面)中是否显示,由 ServerSignature 指令控制。
如果要使用URL,则应指向您控制的另一台服务器。否则,如果出现错误,用户可能无法与您联系。
ServerTokens
描述: 配置HTTP的响应头字段Server
语法: ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
语法: 系统配置文件
默认: ServerTokens Full
状态: Core
模块: Core
该指令控制HTTP的响应头字段Server
是否包括服务器的通用OS类型的描述以及有关编译模块的信息。在2.0.44版之后,该指令还控制 ServerSignature 指令显示在页脚的信息。
此设置适用于整个服务器,无法针对不同的虚拟主机中配置不同的值。
Full (或者未定义):
Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2
Prod[uctOnly]:
Server: Apache
Major:
Server: Apache/2
Minor:
Server: Apache/2.4
Min[imal]:
Server: Apache/2.4.2
OS:
Server: Apache/2.4.2 (Unix)
注意: 禁用响应头字段Server
不会使您的服务器更安全,想靠隐藏服务器信息达到安全的目的几乎是一个神话,它只会产生一个虚假的安全感。
ServerSignature
描述: 配置在特定页面上显示的页脚
语法: ServerSignature On|Off|EMail
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: ServerSignature Off
覆盖: All
状态: Core
模块: Core
允许在服务器生成的文档(错误消息,mod_proxy,目录列表,mod_info,…)下配置页脚行。
- 默认值为
Off
: 禁止返回页脚行。(因此与Apache-1.2及以下版本的行为兼容)。 - 设置为
On
: 在网页上显示带有服务器版本号【版本2.0.44之后,显示的服务器版本号的详细信息由 ServerTokens 指令控制。】和虚拟主机的 ServerName 的页脚。 - 设置为
EMail
: 在On的基础上,在 ServerName 上添加了href指向 ServerAdmin 的链接。
目录路径、文件路径、文件名
ServerRoot
描述: 服务器的基础目录
语法: ServerRoot directory-path
语境: 系统配置文件
状态: Core
模块: Core
服务器的基础目录,一般来说它将包含conf/和logs/子目录,其他配置指令(例如,Include
或者LoadModule
)中的相对路径被视为相对于此目录,默认为安装目录,一般不需要修改。
DocumentRoot
描述: 配置Web文档的根目录
语法: DocumentRoot directory-path
语境: 系统配置文件, <VirtualHost>
片段
默认: DocumentRoot “/usr/local/apache/htdocs”
状态: Core
模块: Core
从Web可见的主文档树的目录,也就是网站根目录。除非与Alias等指令匹配,否则服务器会将从请求的URL中取出相对文档根的路径,附加到文档根目录中,以建立指向文档的实际路径。
例如: DocumentRoot "/usr/web"
,然后访问 http://my.example.com/index.html
指向的是 /usr/web/index.html
;
访问 http://my.example.com/admin/index.html
指向的是 /usr/web/admin/index.html
DirectoryIndex
描述: 当客户端请求一个目录时寻找的资源列表
语法: DirectoryIndex disabled | local-url [local-url] …
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: DirectoryIndex index.html
覆盖: Indexes
状态: Base
模块: mod_dir
Local-url(已通过%
编码的)是一个相对于被请求目录的文档的URL(通常是那个目录中的一个文件)。可以指定多个URL,服务器将应用最先找到的那一个。
例如: DirectoryIndex index.html
,如果存在请求 http://example.com/docs/
,实际访问的是/docs/index.html
,如果index.html不存在,将列出目录(如果配置为允许的话)
注意: 在同一个片段中,使用多个DirectoryIndex
执行的是添加到资源列表,而非覆盖或替换。
例A:
<Directory "/foo">
DirectoryIndex index.html
DirectoryIndex index.php
</Directory>
例B:
<Directory "/foo">
DirectoryIndex index.html index.php
</Directory>
例C:
<Directory "/foo">
DirectoryIndex index.html
DirectoryIndex disabled
DirectoryIndex index.php
</Directory>
例A和B的结果一样,都是index.html和index.php作为索引资源,例C中,只有index.php将保留为索引资源
ErrorLog
参见 Apache入门——日志
ErrorDocument
描述: 出错时服务器返回客户端的内容
语法: ErrorDocument error-code document
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
覆盖: FileInfo
状态: Core
模块: Core
如果出现问题或错误,Apache可以配置为执行以下四种操作之一:
- 输出一个简单的硬编码错误消息
- 输出自定义消息
- 内部重定向到本地URL路径以处理问题/错误
- 重定向到外部URL以处理问题/错误
document 可以由一个斜杠 /
开头来定义一个本地URL(相对于DocumentRoot
),或是提供一个能被客户端解释的完整的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}}
PidFile
描述: 服务器记录守护程序的进程ID的文件
语法: PidFile file-path
语境: 系统配置文件
默认: PidFile logs/httpd.pid
状态: MPM
模块: event, worker, prefork, mpm_winnt, mpmt_os2
PidFile /var/run/apache.pid
TypesConfig
加载文件
Include
描述: 在主配置文件中包含其它配置文件
语法: Include file-path|directory-path|wildcard
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段
状态: Core
模块: Core
Shell风格(fnmatch())的通配符可以用于按照字母顺序一次包含多个文件。另外,如果Include指向了一个目录而不是一个文件,Apache将读入该目录及其子目录下的所有文件,并依照字母顺序将这些文件作为配置文件进行解析。但是并不推荐这么做,因为偶尔会有临时文件在这个目录中生成,从而导致httpd启动失败。
如果通配符表达式与任何文件都不匹配,则该Include
指令将失败并显示错误。
LoadModule
描述: 关联指定名称的对象文件或者库,并添加到动态模块列表
语法: LoadModule module file-path
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_so
用于为 Apache 添加一些模块,比如 php 支持模块,rewrite重定向模块,认证模块等。
例如加载 rewrite_module:
LoadModule rewrite_module modules/mod_rewrite.so
LoadFile
描述: 关联指定名称的对象文件或者库
语法: LoadFile file-path [file-path] …
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_so
用于加载某些模块工作所需的附加代码,例如:
LoadFile "libexec/libxmlparse.so"
配置片段
<Directory>
描述: 为指定目录及其子目录、目录下的文件附加一组访问控制的指令
语法: <Directory directory-path> … </Directory>
语境: 系统配置文件, <VirtualHost>
片段
状态: Core
模块: Core
<Directory>
片段 用于包含一组指令,这些指令仅应用于指定目录,该目录的子目录以及相应目录中的文件。语境中标明了 <Directory>
的任何指令都可以使用在<Directory>
片段中。
Directory-path可以是目录的完整路径;也可以是通配符字符串,其中?
匹配任何单个的字符,*
匹配任意个数的任意字符,[]
来确定?
和*
的字符范围;也可以在 ~
(空格隔开)之后使用正则表达式【尽管如此,还是建议通过<DirectoryMatch>
使用正则表达式形式】。
<Directory ~ "^/www/[0-9]{3}">
</Directory>
注意: /
字符不被任何通配符匹配,因此 <Directory /*/public_html>
不匹配 /home/user/public_html
,但 <Directory /home/*/public_html>
会匹配。
Directory-path可以放在引号之间,也可以不放。但是如果 Directory-path 中包含空格,则必须放在引号之间,否则空格后面的字符不会被解析。
<DirectoryMatch>
描述: 为正则表达式匹配的指定目录及其子目录、目录下的文件附加一组访问控制的指令
语法: <DirectoryMatch regex> … </DirectoryMatch>
语境: 系统配置文件, <VirtualHost>
片段
状态: Core
模块: Core
在2.3.9之前,该指令隐式应用于子目录(与<Directory>
一样),并且不能与行尾符号($
)匹配。在2.3.9及更高版本中,只有与表达式匹配的目录才会受到所附指令的影响。
从2.4.8开始,正则表达式支持命名组和反向引用,通过“MATCH_”和命名组的大写字母表示,例如:
<DirectoryMatch "^/var/www/combined/(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</DirectoryMatch>
<Files>
描述: 为指定文件附加一组访问控制指令
语法: <Files filename> … </Files>
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
覆盖: All
状态: Core
模块: Core
<Files> ... </Files>
用于包含一组指令,这些指令仅应用于指定文件。使用位置中标明了 <Directory>
的任何指令都可以使用在<Files>
片段中。
filename可以是目录的完整路径;也可以是通配符字符串,其中?
匹配任何单个的字符,*
匹配任意个数的任意字符,[]
来确定?
和*
的字符范围;也可以在~
之后使用正则表达式【尽管如此,还是建议通过<FilesMatch>
使用正则表达式形式】。
该指令可以用在<Directory>
片段和.htaccess
文件中。该指令在<Directory>
和.htaccess
文件之后,但在Location
之前,按照定义的先后顺序被解析
<FilesMatch>
描述: 为正则表达式匹配的指定文件附加一组访问控制指令
语法: <FilesMatch regex> … </FilesMatch>
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
覆盖: All
状态: Core
模块: Core
从2.4.8开始,正则表达式支持命名组和反向引用,通过“MATCH_”和命名组的大写字母表示,例如:
<FilesMatch "^(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</FilesMatch>
<Location>
描述: 仅将附带的指令应用于匹配的URL
语法: <Location URL-path|URL> … </Location>
语境: 系统配置文件, <VirtualHost>
片段
状态: Core
模块: Core
<Location>
指令通过URL限制所附指令的范围。它与<Directory>
指令类似,可以使用通配符和正则表达式。<Location>
在<Directory>
和.htaccess
、<Files>
之后被读取识别,如果有多个<Location>
,则按照它们在配置文件中出现的顺序处理。
<Location>
片段完全在文件系统之外运行,所以<Location>
不应使用指令来控制对文件系统位置的访问。
对于所有源(非代理)请求,匹配的是URL请求中的/path/。 不包括协议方案,主机名,端口或查询字符串。 对于代理请求,匹配的是完整的URL请求,包括协议方案、主机名、端口。
在下面的示例中,没有使用尾部斜杠,匹配/private1
,/private1/
和/private1/file.txt
,但不匹配/private1other
:
<Location "/private1">
# ...
</Location>
在下面的示例中,使用了尾部斜杠,匹配/private2/
和/private2/file.txt
,但不匹配/private2
,/private2other
:
<Location "/private2/">
# ...
</Location>
关于/
的注意事项:
斜杠字符具有特殊含义,具体取决于它出现在URL中的位置。人们可能习惯于多个相邻斜杠经常折叠为单个斜杠的行为(即,/home///foo
与/home/foo
等效)。但是在 <LocationMatch>
指令 和 正则表达式版本<Location>
指令的正则表达式中,单个斜杠不会隐式地匹配多个斜杠,因此要明确指定匹配多少个斜杠,以防止客户端通过多个斜杠绕过预想的权限限制。例如,<LocationMatch "^/abc">
匹配请求 /abc
但不匹配请求 //abc
。
URL-path在转换而来的对应的文件系统路径中不会含有相邻斜杠,因此<Directory>
不存在上述问题。
<LocationMatch>
描述: 仅将附带的指令应用于正则表达式匹配的URL
语法: <LocationMatch regex> … </LocationMatch>
语境: 系统配置文件, <VirtualHost>
片段
状态: Core
模块: Core
从2.4.8开始,正则表达式支持命名组和反向引用,通过“MATCH_”和命名组的大写字母表示,例如:
<LocationMatch "^/combined/(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>
<IfDefine>
描述: 封装根据指定的变量是否定义而决定是否生效的指令
语法: <IfDefine [!]parameter-name> … </IfDefine>
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
覆盖: All
状态: Core
模块: Core
该指令有两种形式:
parameter-name
!parameter-name
前一种形式,只有在定义了名为 parameter-name
的变量时,才会处理封装的指令 。第二形式相反,在未定义名为 parameter-name
的变量时,才处理封装的指令。
注意区分:
Define 定义的变量 |
shell 环境变量 |
httpd -D 定义的变量 |
|
---|---|---|---|
用于 ${VAR} |
可以 | 可以 | 不可以 |
用于 <IfDefine VAR></IfDefine> |
可以 | 不可以 | 可以 |
<IfModule>
描述: 封装根据指定的模块是否启用而决定是否生效的指令
语法: <IfModule [!]module-file|module-identifier> … </IfModule>
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
覆盖: All
状态: Core
模块: Core
在<IfModule>
片段中的指令仅当结果为true时才进行处理,否则所有其间的指令都将被忽略
module-file
是指编译模块时的文件名,比如 mod_rewrite.c
(linux)或者 mod_rewrite.so
(windows)module-identifier
是指模块的标识符,比如 rewrite_module
有以下两种形式的用法:
module
!module
<VirtualHost>
描述: 定义虚拟主机
语法: <VirtualHost addr[:port] [addr[:port]] …> … </VirtualHost>
语境: 系统配置文件
状态: Core
模块: Core
<VirtualHost>
用于定义虚拟主机,使用不同的addr[:port]
定义的每个<VirtualHost>
片段标识不同的虚拟主机。Addr可以是以下任何一个可选项,后跟冒号和端口号(或*):
- 虚拟主机的IP地址(IPv6地址必须在方括号中指定,否则无法确定可选的端口号)
- 虚拟主机IP地址的完全限定域名(不推荐)
- 通配符
*
,匹配任何IP地址 - 字符串
_default_
,是*
的别名
<VirtualHost>
指令中指定的端口号不会影响Apache侦听的端口号,它们只控制<VirtualHost>
将选择哪个端口号来处理请求。
在指令的语境中标明了<VirtualHost>
片段的指令可以用在<VirtualHost>
片段中。应在每个<VirtualHost>
片段内指定一个ServerName
, 如果未定义, ServerName将继承“主”服务器配置。
收到请求后,服务器首先根据本地IP地址和端口组合将其映射到最佳匹配的<VirtualHost>
片段,非通配符具有更高的优先级。如果根据本地IP地址和端口组合未匹配到任何<VirtualHost>
片段,则使用“主”服务器配置,不使用任何虚拟主机;如果多个虚拟主机都包含最匹配的IP地址和端口,则服务器会根据请求的主机名从这些虚拟主机中选择最佳匹配。如果未找到匹配的基于名称的虚拟主机,则将使用与IP地址匹配的第一个列出的虚拟主机。因此,给定IP地址和端口组合的第一个列出的虚拟主机是该IP和端口组合的默认虚拟主机。
配置片段中允许的指令
查看每个指令的语境部分,标明了<VirtualHost>
的指令允许用在<VirtualHost>
片段中;标明了 <Directory>
的指令允许用在 <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>
等部分。但是有一些例外:
AllowOverride
指令仅在<Directory>
片段有效。Options
选项的FollowSymLinks
和SymLinksIfOwnerMatch
只在<Directory>
片段或.htaccess
文件中有效。Options
指令不能用于<Files>
和<FilesMatch>
部分。
配置片段中指令的合并顺序
Apache按照以下顺序依次解析指令片段:
非正则表达式版的
<Directory>
与.htaccess
。如果有多个
Directory
和.htaccess
作用于多个目录,目录层级更短的先解析如果不同
Directory
的目录层级相同,则先定义的先解析如果
Directory
和.htaccess
的目录层级相同,则Directory
先解析以下指令解析的顺序为1-3-2-4:
<Directory /a> #指令组1
<Directory /a/b> #指令组2
/a/.htaccess #指令组3
/a/b/.htaccess #指令组4
<DirectoryMatch>
(和<Directory "~">
),作用于相同目录时先定义的先解析<Files>
与<FilesMatch>
,作用于相同文件时先定义的先解析<Location>
与<LocationMatch>
,作用于相同URL时先定义的先解析<IfDefine>
与<IfModule>
,先定义的先解析。
在解析过程中,先解析的指令会被后解析的指令覆盖。