<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 操作指南 / 教程

Apache HTTP 服务器教程:.htaccess 文件

可用语言:  en  |  es  |  fr  |  ja  |  ko  |  pt-br 

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

Support Apache!

另请参阅

top

.htaccess 文件

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

它们是什么/如何使用它们

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

注意

如果您想将 .htaccess 文件命名为其他名称,可以使用 AccessFileName 指令更改文件名。例如,如果您想将文件命名为 .config,则可以在服务器配置文件中添加以下内容

AccessFileName ".config"

通常,.htaccess 文件使用与 主配置文件 相同的语法。您可以将哪些内容放入这些文件中取决于 AllowOverride 指令。此指令按类别指定如果在 .htaccess 文件中找到哪些指令将被接受。如果指令在 .htaccess 文件中被允许,则该指令的文档将包含一个 Override 部分,指定为了允许该指令,AllowOverride 中必须包含什么值。

例如,如果您查看 AddDefaultCharset 指令的文档,您会发现它在 .htaccess 文件中是允许的。(请参阅指令摘要中的 Context 行。)Override 行显示为 FileInfo。因此,您必须至少具有 AllowOverride FileInfo 才能使此指令在 .htaccess 文件中生效。

示例

上下文 服务器配置、虚拟主机、目录、.htaccess
覆盖 FileInfo

如果您不确定特定指令是否在 .htaccess 文件中被允许,请查看该指令的文档,并检查 Context 行以查看“.htaccess”。

top

何时(不)使用 .htaccess 文件

通常,只有在您无法访问主服务器配置文件时才应使用 .htaccess 文件。例如,存在一个普遍的误解,即用户身份验证始终应该在 .htaccess 文件中进行,近年来,另一个误解是 mod_rewrite 指令必须放在 .htaccess 文件中。事实并非如此。您可以将用户身份验证配置放在主服务器配置文件中,事实上,这是首选方法。同样,mod_rewrite 指令在许多方面在主服务器配置文件中效果更好。

在内容提供者需要在每个目录的基础上对服务器进行配置更改,但没有服务器系统的 root 访问权限的情况下,应该使用 .htaccess 文件。如果服务器管理员不愿意进行频繁的配置更改,则可能希望允许各个用户在 .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 相关的限制。有关此主题的更多详细信息,请参阅 重写指南

第二个考虑因素是安全性。您允许用户修改服务器配置,这可能会导致您无法控制的更改。仔细考虑您是否要授予用户此权限。还要注意,授予用户比他们需要的权限更少的权限会导致额外的技术支持请求。确保您清楚地告知用户您授予了他们什么级别的权限。指定您将 AllowOverride 设置为何值,并向他们提供相关文档,这将帮助您避免以后的困惑。

请注意,将 .htaccess 文件放在包含指令的目录 /www/htdocs/example 中与在主服务器配置中将相同指令放在 Directory 部分 <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
top

指令是如何应用的

.htaccess 文件中找到的配置指令将应用于找到 .htaccess 文件的目录及其所有子目录。但是,重要的是还要记住,上级目录中可能存在 .htaccess 文件。指令按找到的顺序应用。因此,特定目录中的 .htaccess 文件可能会覆盖在目录树中更高位置找到的 .htaccess 文件中的指令。而这些指令又可能会覆盖在更高位置找到的指令,或者覆盖主服务器配置文件本身中的指令。

示例

在目录 /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 与主配置文件的合并

配置部分 文档中所述,.htaccess 文件可以覆盖对应目录的 <Directory> 部分,但会被来自主配置文件的其他类型的配置部分覆盖。此事实可用于强制执行某些配置,即使在存在宽松的 AllowOverride 设置的情况下也是如此。例如,要阻止脚本执行,同时允许在 .htaccess 中设置任何其他内容,可以使用

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

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>
此示例假设您的 DocumentRoot/www/htdocs
top

身份验证示例

如果您直接跳到本文档的这一部分来了解如何进行身份验证,那么有一点很重要。存在一个普遍的误解,即您需要使用 .htaccess 文件才能实现密码身份验证。事实并非如此。将身份验证指令放在主服务器配置文件中的 <Directory> 部分是实现此目的的首选方法,只有在您无法访问主服务器配置文件时才应使用 .htaccess 文件。请参阅 上面,了解何时应该以及何时不应该使用 .htaccess 文件。

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

.htaccess 文件内容

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

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

请参阅 身份验证教程,以更全面地了解身份验证和授权。

top

服务器端包含示例

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

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

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

有关服务器端包含的更完整讨论,请参阅 SSI 教程

top

.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 文档

top

CGI 示例

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

Options +ExecCGI
AddHandler cgi-script cgi pl

或者,如果您希望将给定目录中的所有文件都视为 CGI 程序,这可以通过以下配置完成

Options +ExecCGI
SetHandler cgi-script

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

有关 CGI 编程和配置的更完整讨论,请参阅 CGI 教程

top

故障排除

当您将配置指令放入 .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

在这种情况下,错误消息应该特定于您所犯的特定语法错误。

可用语言:  en  |  es  |  fr  |  ja  |  ko  |  pt-br 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们被实施或被认为无效/主题无关,我们的版主可能会将其删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表