Apache HTTP 服务器版本 2.4
.htaccess
文件提供了一种在每个目录的基础上进行配置更改的方法。
相关模块 | 相关指令 |
---|---|
.htaccess
文件。使用 .htaccess
文件会降低 Apache http 服务器的速度。您可以将 .htaccess
文件中包含的任何指令更好地设置在 Directory
块中,因为它们将具有相同的效果,但性能更好。.htaccess
文件(或“分布式配置文件”)提供了一种在每个目录的基础上进行配置更改的方法。包含一个或多个配置指令的文件被放置在特定的文档目录中,并且这些指令适用于该目录及其所有子目录。
如果您想将 .htaccess
文件命名为其他名称,可以使用 AccessFileName
指令更改文件名。例如,如果您想将文件命名为 .config
,则可以在服务器配置文件中添加以下内容
AccessFileName ".config"
通常,.htaccess
文件使用与 主配置文件 相同的语法。您可以将哪些内容放入这些文件中取决于 AllowOverride
指令。此指令按类别指定如果在 .htaccess
文件中找到哪些指令将被接受。如果指令在 .htaccess
文件中被允许,则该指令的文档将包含一个 Override 部分,指定为了允许该指令,AllowOverride
中必须包含什么值。
例如,如果您查看 AddDefaultCharset
指令的文档,您会发现它在 .htaccess
文件中是允许的。(请参阅指令摘要中的 Context 行。)Override 行显示为 FileInfo
。因此,您必须至少具有 AllowOverride FileInfo
才能使此指令在 .htaccess
文件中生效。
如果您不确定特定指令是否在 .htaccess
文件中被允许,请查看该指令的文档,并检查 Context 行以查看“.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
在 .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
文件可以覆盖对应目录的 <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
时,请注意每个目录的上下文会略有不同。特别是,规则被认为是相对于当前目录的,而不是原始请求的 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 文档。
最后,您可能希望使用 .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
在这种情况下,错误消息应该特定于您所犯的特定语法错误。