主配置文件
将指令放在纯文本的配置文件中来配置Apache。通常将httpd.conf
作为主配置文件。Linux系统中,此文件的位置在编译时设置,但可以使用-f
命令行标志覆盖;windows系统中,此文件的位置在服务器根目录下的conf
文件夹。此外,可以使用 Include
指令添加其他配置文件,并且可以使用通配符包含许多配置文件。任何指令都可以放在任何这些配置文件中。只有在重新启动时,httpd才会识别对主配置文件的更改。
服务器还读取包含mime类型列表的文件; 文件位置由 TypesConfig 指令设置,默认为conf/mime.types
。
配置文件的语法
httpd配置文件每行包含一个指令。反斜杠 \
可以用作一行上的最后一个字符,表示该指令继续到下一行。反斜杠和行尾之间不能有其他字符或空格。
指令的参数由空格分隔。如果参数包含空格,则必须将该参数括在引号中。
配置文件中的指令不区分大小写,但指令的参数通常区分大小写。以 #
开头的行被视为注释,并被忽略。注释可能不会与配置指令包含在同一行中。指令之前出现的空格也会被忽略,因此为了清楚起见,您可以缩进指令。空行也会被忽略。
使用 Define
或 shell
环境变量定义的变量值可以在配置文件行中通过 ${VAR}
来使用。如果 VAR
是有效变量的名称,则配置文件中的${VAR}
将替换为 VAR
变量的值,并继续处理,就好像直接在配置文件中写入该文本一样。Define
定义的变量优先于 shell
环境变量。如果未找到 VAR
变量,则字符 ${VAR}
保持不变,并记录警告。变量名不能包含冒号 :
,以避免与RewriteMap语法冲突。
只有在服务器启动之前定义的 shell
环境变量才能用于扩展。在配置文件本身中定义的环境变量(例如SetEnv
)生效太晚,无法用于配置文件中的扩展。
在变量替换和连接任何连续行之后,正常配置文件中的单行的最大长度约为16 MiB。在.htaccess文件中,最大长度为8190个字符。
您可以使用 apachectl configtest
或 -t
命令行选项检查配置文件中的语法错误,而无需启动服务器。
.htaccess文件
httpd允许通过放置在Web树中的特殊文件来分散管理配置。这个特殊文件的文件名默认为.htaccess
,但可以通过指令 AccessFileName 指定为其他名称。放置在 .htaccess
文件中的指令适用于放置文件的目录和所有子目录。这些 .htaccess
文件遵循与主配置文件相同的语法。由于每次请求都会读取 .htaccess
文件,因此对这些文件所做的更改会立即生效。
每一个指令都会标明指令允许使用的 语境,语境中含有 .htaccess
的指令可以用在 .htaccess
文件中。系统配置文件中的指令 AllowOverride 、AllowOverrideList进一步控制.htaccess
文件中写入的哪些类型的指令会真正生效。
模块
httpd
是一个模块化服务器。这意味着核心服务器中只包含最基本的功能,通过可以加载到httpd的模块提供扩展功能。缺省情况下,在编译时服务器中包含一个基本的模块集合。如果服务器编译为使用动态加载的模块,则可以单独编译模块,并可以使用 LoadModule 指令随时添加模块。否则,必须重新编译httpd以添加或删除模块。可以通过将配置指令封闭在 <IfModule>
片段中而以特定模块的存在为条件才生效。然而, <IfModule>
片段不是必需的,在使用 <IfModule>
后,即使缺少模块,服务器在启动时也不会报错,这可能会掩盖您缺少一个重要模块的事实。
要查看当前编译到服务器中的模块,可以使用 -l
命令行选项。您还可以使用 -M
命令行选项查看动态加载的模块。
描述指令的术语
描述
说明指令的用途。
语法
说明指令的使用方法,语法中常用以下代号表示特定意义:
- URL: 完整的统一资源定位器,包括协议类型,主机名和可选路径名,如
http://www.example.com/path/to/file.html
- URL-path: URL中,在协议类型和主机名之后的部分,如
/path/to/file.html
。该URL-path
表示网络web资源的路径,而不是一个文件系统的路径。 - file-path: 本地文件系统中以根目录开头文件的路径,如
/usr/local/apache/htdocs/path/to/file.html
。除非另行指定,否则不以根目录开头的相对文件路径将被视为相对于 ServerRoot。 - directory-path: 从根目录开始的本地文件系统中目录的路径(无需斜杠结尾),如
/usr/local/apache/htdocs/path/to/
。除非另行指定,否则不以根目录开头的相对路径将被视为相对于 ServerRoot。 - filename:没有伴随路径信息的文件名,如
file.html
。 - regex:正则表达式,指令将定义正则表达式匹配的内容。
- extension:扩展名。通常是最后一个点后面的文件名的一部分。但是,Apache识别多个文件扩展名,因此如果文件名包含多个点,则第一个点后面的文件名的每个点分隔部分都是扩展名。例如,文件名
file.html.en
包含两个扩展名:.html
和.en
。对于Apache指令,可以指定带有或不带点的扩展名。此外,扩展名不区分大小写。 - mime-type: 一种描述文件格式的方法,该文件由主格式类型和次格式类型组成,用斜杠分隔,如
text/html
。
默认
如果指令具有默认值(即,如果您从配置中完全省略它,则Apache Web服务器的行为就像您将其设置为特定值一样),此部分将对此进行描述。请注意,此处列出的默认值不一定与指令在随服务器一起分发的默认httpd.conf中所采用的值相同。
语境
说明指令使用的合法位置,它是以逗号分隔的以下值的列表:
- 系统配置文件: 表示指令可以用在系统配置文件中,例如,
httpd.conf
。除非另行指定,否则不能用在<Directory>
片段和<VirtualHost>
等片段中。 <Directory>
片段: 表示指令可以用在<Directory>, <Location>, <Files>, <If>,<IfDefine>, <IfModule>和 <Proxy>
片段中。<VirtualHost>
片段: 表示指令可以用在<VirtualHost>
片段中。- .htaccess文件: 表示指令可以用在
.htaccess
文件中,.htaccess
文件可以在网站各级目录中定义。指令可能不会被处理,取决于指令的覆盖规则。
指令仅在指定的上下文中允许; 如果您尝试在其他地方使用它,您将收到一个配置错误,该错误将阻止服务器正确处理该语境中的请求,或者将使服务器完全无法启动。
指令的有效位置实际上是所有列出的语境的布尔OR的结果。换句话说,在“系统配置文件, .htaccess”中标记为有效的指令可以在 httpd.conf
文件和.htaccess
文件中使用,但不能在任何 <Directory>
片段或 <VirtualHost>
片段中使用。
覆盖
表示此指令所属的指令类型。当前指令出现在.htaccess
文件中的时候,要想指令生效,还需要 AllowOverride 指令设置的允许覆盖的指令类型列表中包含此类型。
状态
表明该指令与Apache服务器的绑定程度如何; 换句话说,您可能需要使用增强的模块集重新编译服务器,以便获得对指令及其功能的访问权限。此属性的可能值为:
- Core: 如果指令被列为具有“Core”状态,则表示它是Apache Web服务器最内层部分的一部分,并且始终可用。
- MPM: 标记为具有“MPM”状态的指令由多处理模块提供。当且仅当您使用指令定义的Module行中列出的MPM之一时,此类指令才可用。
- Base: 默认情况下编译到服务器中的标准Apache模块之一,标记为具有“Base”状态的指令,通常可用,除非您已从配置中删除模块。
- Extension: 具有“Extension”状态的指令由Apache服务器工具包中包含的其中一个模块提供,但该模块通常不会编译到服务器中。要启用该指令及其功能,您需要更改服务器构建配置文件并重新编译Apache。
- Experimental: “Experimental”状态表示该指令可作为Apache工具包的一部分提供,但它目前仍为实验性指令,您可以自主决定是否使用它。
模块
列出定义指令的模块
指令的范围
放置在配置文件中的指令适用于整个服务器。如果仅希望更改服务器的一部分配置,则可以通过将指令放置在 <Directory> 、 <DirectoryMatch> 、<Files> 、<FilesMatch> 、<Location> 和 <LocationMatch> 片段来调整指令的范围。这些片段限制了包含在其内部的指令作用的目录、文件、位置等。它们也可以嵌套,允许非常细粒度的配置。
httpd 通过虚拟主机可以同时为许多不同的网站提供服务。也可以通过将指令放在 <VirtualHost> 片段中来限定范围,以便它们仅适用于特定网站的请求。
尽管大多数指令可以放在这些片段中,但某些指令在某些情况下没有意义。
例外情况
- Apache指令在同一作用范围,一般是后定义的覆盖先定义的:
- 指令 DirectoryIndex,会把先后定义的整合成一个列表
- 指令Listen,使用多个
Listen
指令监听多个地址和端口的请求
- 定义在片段中的Apache指令一般只在片段条件满足时生效:
- 指令 Define,在其定义后的所有指令中都可以使用,而不局限于配置片段