.htaccess 文件提供了一种在每个目录基础上进行配置更改的方法。
.htaccess文件
相关模块 | 相关指令 |
---|---|
|
|
如果您有权访问httpd主服务器配置文件,则应该避免完全使用.htaccess文件。使用.htaccess文件会降低您的Apache HTTP服务器速度。任何可以包含在.htaccess文件中的指令都可以在一个Directory块中更好地设置,因为它具有相同的效果并且具有更好的性能。
.htaccess是什么/如何使用.htaccess
.htaccess文件(或“分布式配置文件”)提供了一种在每个目录基础上进行配置更改的方法。包含一个或多个配置指令的文件被放置在特定的文档目录中,并且该指令适用于该目录及其所有子目录。
注意:如果你想调用你的.htaccess文件,你可以使用AccessFileName指令改变文件的名字。例如,如果您想调用该文件.config,则可以将以下内容放入服务器配置文件中:
AccessFileName “.config”
通常,.htaccess文件使用与主配置文件相同的语法。你可以放入这些文件是由AllowOverride指令决定的 。该指令决定了哪些对应目录下的.htaccess文件中的指令将被授权。如果.htaccess文件中允许指令,则该指令的文档将包含一个覆盖部分,指定AllowOverride必须包含哪些值以允许该指令。
例如,如果您查看AddDefaultCharset 指令的文档,您会发现它在.htaccess 文件中是允许的。(请参阅指令摘要中的上下文行。)覆盖行读取 FileInfo。因此,您必须至少 AllowOverride FileInfo为了使此指令在.htaccess文件中得到遵守。
例
Context: server config, virtual host, directory, .htaccess
Override: FileInfo
何时(不)使用.htaccess文件
一般来说,只有.htaccess当您无法访问主服务器配置文件时才应使用文件。例如,有一种常见的误解认为,用户认证应该始终以.htaccess文件形式完成,并且在最近几年,还有另一个误解,即mod_rewrite指令必须放在.htaccess文件中。这根本不是那么回事。您可以将用户身份验证配置置于主服务器配置中,事实上,这是做事的首选方式。同样,mod_rewrite在许多方面,指令在主服务器配置中工作得更好。
.htaccess应在内容提供程序需要按每个目录对服务器进行配置更改但在服务器系统上没有超级用户权限的情况下使用这些文件。如果服务器管理员不愿意频繁进行配置更改,则可能需要允许个别用户.htaccess为自己的文件进行这些更改。例如,在ISP在单台机器上托管多个用户站点并希望其用户能够更改其配置的情况下尤其如此。
但是,一般情况下,.htaccess应尽可能避免使用文件。您可能会考虑放入.htaccess文件中的任何配置,可以在您的主服务器配置文件的一个部分中进行。
避免使用.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包含指令的目录中,并将相同的指令放入主服务器配置中的目录部分 :
/www/htdocs/example目录下的.htaccess:
AddType text/example ".exm"
您的httpd.conf 文件中的部分:
AddType text/example ".exm"
但是,将此配置放入服务器配置文件中会降低性能,因为配置在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文件可以覆盖相应目录的部分,但将被主配置文件中其他类型的配置部分覆盖。这个事实可以用来执行某些配置,即使在自由AllowOverride设置的情况下也是如此。例如,要阻止脚本执行,同时允许其他设置, .htaccess可以使用:
AllowOverride All
Options +IncludesNoExec -ExecCGI
这个例子假定你DocumentRoot是/www/htdocs。
认证示例
如果您直接跳到文档的这一部分以了解如何进行身份验证,请务必注意一件事。有一种常见的误解是,您需要使用 .htaccess文件才能实现密码验证。不是这种情况。将认证指令放在 主服务器配置文件的一个部分中是实现此目的的首选方式,.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
在.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/从中删除。因此,您的正则表达式也需要省略该部分。
CGI例子
最后,您可能希望使用.htaccess文件来允许在特定目录中执行CGI程序。这可以通过以下配置来实现:
Options +ExecCGI
AddHandler cgi-script cgi pl
或者,如果您希望将给定目录中的所有文件都视为CGI程序,则可以使用以下配置完成此操作:
Options +ExecCGI
SetHandler cgi-script
请注意,AllowOverride Options并AllowOverride FileInfo必须同时生效使这些指令产生任何影响。
故障排除
当你把配置指令放在一个.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
在这种情况下,错误消息应该特定于您所犯的特定语法错误。