<-
Apache HTTP 服务器 2.4 > .htaccess文件

Apache HTTP Server教程:.htaccess文件

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

支持Apache!

也可以看看

最佳

.htaccess文件

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

它们是什么/如何使用

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

注意:

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

AccessFileName ".config"

通常,.htaccess文件使用与主要配置文件相同的语法。您可以在这些文件中放入的内容由AllowOverride指令决定 。该伪指令按类别指定了在.htaccess文件中找到后将遵循的伪指令。如果.htaccess文件中允许使用伪指令,则该伪指令的文档将包含“覆盖”部分,指定必须具有什么值才能AllowOverride允许该伪指令。

例如,如果查看该AddDefaultCharset 指令的文档,则会发现该指令在.htaccess 文件中是允许的。(请参见指令摘要中的“上下文”行。)“ 替代”行显示为 FileInfo。因此,您必须至少具有 AllowOverride FileInfo.htaccess文件中遵守该指令的权限。

例:

内容: 服务器配置,虚拟主机,目录,.htaccess
覆写: 文件信息

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

最佳

何时(不使用).htaccess文件

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

.htaccess如果内容提供者需要按目录对服务器进行配置更改,但在服务器系统上没有root用户访问权限,则应使用这些文件。如果服务器管理员不愿意频繁更改配置,则可能希望允许各个用户.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 "/www/htdocs/example">在主服务器配置的“目录”部分 中完全等效:

.htaccess归档于/www/htdocs/example

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

AddType text/example ".exm"

从你的第httpd.conf 文件

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

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

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

AllowOverride None
最佳

指令如何应用

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

例:

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

Options +ExecCGI

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

在目录中,/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
最佳

认证示例

如果您直接跳到文档的这一部分以了解如何进行身份验证,那么注意一件事很重要。有一个普遍的误解,认为您必须使用 .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这些指令必须生效才能生效。

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

最佳

服务器端包含示例

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

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

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

请参阅SSI教程,以更全面地讨论服务器端包含。

最佳

重写.htaccess文件中的规则

RewriteRule.htaccess文件中使用时 ,请注意每个目录的上下文会稍作更改。特别是,规则被视为相对于当前目录,而不是原始请求的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

最佳

CGI范例

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

Options +ExecCGI
AddHandler cgi-script cgi pl

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

Options +ExecCGI
SetHandler cgi-script

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

请参阅CGI教程,以更全面地讨论CGI编程和配置。

最佳

故障排除

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

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

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

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。