.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
文件中进行,而在最近几年,又出现了另一种误解,即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
:
/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
文件可以覆盖<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教程,以更全面地讨论服务器端包含。
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
。
最后,您可能希望使用一个.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
在这种情况下,错误消息应特定于您所提交的特定语法错误。