Apache HTTP Server 教程:.htaccess 文件

.htaccess文件提供了一种基于每个目录进行配置更改的方法。

.htaccess files

Related Modules Related Directives
core
mod_authn_file
mod_authz_groupfile
mod_cgi
mod_include
mod_mime
AccessFileName
AllowOverride
Options
AddHandler
SetHandler
AuthType
AuthName
AuthUserFile
AuthGroupFile
Require

Note

如果可以访问 httpd 主服务器配置文件,则应避免完全使用.htaccess个文件。使用.htaccess文件会降低 Apache http 服务器的速度。可以在.htaccess文件中包含的任何指令最好在Directory块中设置,因为它具有相同的效果和更好的性能。

它们是什么/如何使用

.htaccess文件(或“分布式配置文件”)提供了一种基于每个目录进行配置更改的方法。包含一个或多个配置指令的文件放置在特定的文档目录中,这些指令适用于该目录及其所有子目录。

Note:

如果要以其他方式调用.htaccess文件,则可以使用AccessFileName伪指令更改文件名。例如,如果您希望将文件命名为.config,则可以将以下内容放入服务器配置文件中:

AccessFileName ".config"

通常,.htaccess文件使用与主要配置文件相同的语法。您可以在这些文件中放置的内容由AllowOverride指令确定。该伪指令按类别指定了在.htaccess文件中找到的伪指令。如果.htaccess文件中允许使用伪指令,则该伪指令的文档将包含一个 Override 节,指定AllowOverride中必须包含什么值才能允许该伪指令。

例如,如果您查看AddDefaultCharset指令的文档,则会发现.htaccess文件中允许使用该指令。 (请参阅指令摘要中的“上下文”行.)Override行读取为FileInfo。因此,您必须至少具有AllowOverride FileInfo才能在.htaccess文件中使用此指令。

Example:

Context: 服务器配置,虚拟主机,目录,.htaccess
Override: FileInfo

如果不确定.htaccess文件中是否允许特定指令,请查看该指令的文档,然后在上下文行中检查“ .htaccess”。

何时(不)使用.htaccess 文件

通常,仅当您无权访问主服务器配置文件时,才应使用.htaccess文件。例如,存在一个普遍的误解,即用户身份验证应始终在.htaccess文件中进行,而在最近几年,又出现了另一个误解,即mod_rewrite指令必须在.htaccess文件中进行。这根本不是那么回事。您可以将用户身份验证配置放在主服务器配置中,实际上,这是首选的处理方式。同样,在许多方面,mod_rewrite指令在主服务器配置中效果更好。

如果内容提供商需要按目录对服务器进行配置更改,但对服务器系统没有超级用户访问权限,则应使用.htaccess文件。如果服务器 Management 员不愿意频繁更改配置,则可能希望允许单个用户自己在.htaccess文件中进行这些更改。例如,在 ISP 在单个计算机上托管多个用户站点并希望其用户能够更改其配置的情况下,尤其如此。

但是,通常应尽可能避免使用.htaccess文件。您可以考虑放入.htaccess文件中的任何配置,都可以在主服务器配置文件中的<Directory>部分中有效地进行。

避免使用.htaccess文件的主要原因有两个。

首先是性能。如果将AllowOverride设置为允许使用.htaccess文件,则 httpd 将在每个目录中查找.htaccess文件。因此,无论您实际上是否使用它们,.htaccess文件的许可都会导致性能下降!此外,每次请求文档时都会加载.htaccess文件。

还要注意,httpd 必须在所有更高级别的目录中查找.htaccess文件,以便具有必须应用的指令的完整补充。 (请参阅指令如何应用上的部分。)因此,如果从目录/www/htdocs/example中请求文件,则 httpd 必须查找以下文件:

/.htaccess /www/.htaccess /www/htdocs/.htaccess /www/htdocs/example/.htaccess

因此,对于该目录之外的每个文件访问,将有 4 个其他文件系统访问,即使这些文件都不存在。 (请注意,只有为/启用了.htaccess个文件,情况才会如此,通常情况并非如此.)

对于RewriteRule指令,必须在.htaccess上下文中将这些正则表达式与对目录的每个请求一起重新编译,而在主服务器配置上下文中,它们将被编译一次并进行缓存。此外,规则本身更加复杂,因为每个规则都必须解决每个目录上下文和mod_rewrite附带的限制。有关此主题的更多详细信息,请咨询Rewrite Guide

第二个考虑因素是安全性。您允许用户修改服务器配置,这可能会导致您无法控制的更改。仔细考虑您是否要授予用户此特权。还请注意,为用户提供比他们所需的特权少的特权将导致其他技术支持请求。确保您清楚地告诉用户您所授予的特权级别。确切指定您设置的AllowOverride并将其指向相关的文档,以后可以避免很多麻烦。

请注意,将一个.htaccess文件放入包含指令的目录/www/htdocs/example并将同一指令放入您的主服务器配置的目录部分<Directory "/www/htdocs/example">完全等效:

/www/htdocs/example中的.htaccess个文件:

/ www/htdocs/example 中.htaccess 文件的内容

AddType text/example ".exm"

httpd.conf 文件中的部分

<Directory "/www/htdocs/example">
    AddType text/example ".exm"
</Directory>

但是,将此配置放入您的服务器配置文件将减少性能影响,因为该配置在 httpd 启动时加载一次,而不是在每次请求文件时加载。

可以通过将AllowOverride指令设置为none来完全禁用.htaccess文件的使用:

AllowOverride None

如何应用指令

.htaccess文件中找到的配置指令将应用于找到.htaccess文件的目录及其所有子目录。但是,同样重要的是要记住,目录中可能有.htaccess个文件。指令按照找到的 Sequences 应用。因此,特定目录中的.htaccess文件可能会覆盖在目录树中较高位置的.htaccess文件中找到的指令。而这些反过来可能在更高的位置或者在主服务器配置文件本身中找到了覆盖的指令。

Example:

在目录/www/htdocs/example1中,我们有一个.htaccess文件,其中包含以下内容:

Options +ExecCGI

(注意:必须具有有效的“ AllowOverride Options”,才能在.htaccess文件中使用“ Options”指令。)

在目录/www/htdocs/example1/example2中,我们有一个.htaccess文件,其中包含:

Options Includes

由于存在第二个.htaccess文件,因此在目录/www/htdocs/example1/example2中不允许执行 CGI,因为只有Options Includes有效,这会完全覆盖可能已在使用的任何较早的设置。

.htaccess 与主要配置文件的合并

如关于Configuration Sections的文档中所讨论的,.htaccess文件可以覆盖相应目录的<Directory>节,但是将被主要配置文件中的其他类型的配置节所覆盖。即使存在AllowOverride自由设置,此事实也可用于强制执行某些配置。例如,要防止脚本执行同时允许在.htaccess中设置其他任何内容,可以使用:

<Directory "/www/htdocs">
    AllowOverride All
</Directory>

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>

Note

本示例假定您的DocumentRoot/www/htdocs

Authentication example

如果您直接跳到文档的这一部分以了解如何进行身份验证,那么注意一件事很重要。有一个普遍的误解,认为您必须使用.htaccess文件才能实现密码验证。不是这种情况。将身份验证伪指令放在主服务器配置文件中的<Directory>部分中是实现此目的的首选方法,只有在您无权访问主服务器配置文件时,才应使用.htaccess文件。请参见above,以获取有关何时应该和不应该使用.htaccess文件的讨论。

话虽如此,如果您仍然认为您需要使用.htaccess文件,则可能会发现以下配置可能对您有用。

.htaccess文件内容:

AuthType Basic
AuthName "Password Required"
AuthUserFile "/www/passwords/password.file"
AuthGroupFile "/www/passwords/group.file"
Require group admins

请注意,AllowOverride AuthConfig必须有效才能使这些指令生效。

请参阅authentication tutorial,以获得有关身份验证和授权的更完整讨论。

服务器端包含示例

.htaccess文件的另一个常见用途是为特定目录启用服务器端包含。这可以通过以下配置指令来完成,这些指令位于所需目录的.htaccess文件中:

Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml

请注意,AllowOverride OptionsAllowOverride FileInfo必须都同时生效,这些指令才能生效。

请参阅SSI tutorial以获取有关服务器端包含项的更完整讨论。

.htaccess 文件中的重写规则

.htaccess个文件中使用RewriteRule时,请注意每个目录的上下文会稍有改变。特别是,规则被视为相对于当前目录,而不是原始请求的 URI。请考虑以下示例:

# In httpd.conf
RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"

# In .htaccess in root dir
RewriteRule "^images/(.+)\.jpg" "images/$1.png"

# In .htaccess in images/
RewriteRule "^(.+)\.jpg" "$1.png"

在文档目录中的.htaccess中,从提供给RewriteRule的值中删除前导斜杠,在images子目录中,从中删除/images/。因此,您的正则表达式也需要省略该部分。

有关使用mod_rewrite的更多详细信息,请咨询mod_rewrite documentation

CGI example

最后,您可能希望使用.htaccess文件来允许在特定目录中执行 CGI 程序。这可以通过以下配置实现:

Options +ExecCGI
AddHandler cgi-script cgi pl

或者,如果希望将给定目录中的所有文件都视为 CGI 程序,则可以使用以下配置来完成:

Options +ExecCGI
SetHandler cgi-script

请注意,AllowOverride OptionsAllowOverride FileInfo必须都同时生效,这些指令才能生效。

请参阅CGI tutorial,以获得有关 CGI 编程和配置的更完整讨论。

Troubleshooting

当您将配置指令放在.htaccess文件中时,您没有得到预期的效果,可能有很多事情出错了。

最常见的问题是未设置AllowOverride使得您的配置指令得到遵守。确保所涉及的文件范围没有AllowOverride None生效。一个很好的测试方法是将垃圾放入.htaccess文件中,然后重新加载页面。如果未生成服务器错误,则几乎可以肯定AllowOverride None有效。

另一方面,如果在尝试访问文档时遇到服务器错误,请检查 httpd 错误日志。它可能会告诉您,不允许在.htaccess文件中使用的指令。

[Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here

这将表明您已使用了.htaccess文件中从未允许的指令,或者您只是没有将AllowOverride设置为足以满足所使用指令的级别。请查阅该特定指令的文档以确定哪种情况。

或者,它可能告诉您在使用指令本身时出现语法错误。

[Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters

在这种情况下,错误消息应特定于您已提交的特定语法错误。

首页