Apache HTTP Server .htaccess文件详解

本篇是对Apache httpd 2.2版.htaccess官方帮助文档的翻译,力求严谨准确


Apache HTTP Server 教程:.htaccess文件


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


.htaccess文件

相关模块                        相关指令

core                               AccessFileName

mod authn file              AllowOverride

mod authz groupfile     Options

mod cgi                         AddHandler

mod include                  SetHandler

mod mime                     AuthType

                                      AuthName

                                      AuthUserFile

                                      AuthGroupFile

                                      Require


如果对主服务器配置文件有访问权限的话,你应该完全避免使用.htaccess文件。使用.htaccess会拖慢你的Apache http服务。任何可以包含在.htaccess文件中的指令最好设置在Directory块中,这样也会起到相同的作用但是会有更好的性能。


.htaccess文件是什么/如何使用他们

.htaccess文件(或者叫“分布式配置文件”)提供了一种基于每目录的对配置进行修改的方法。一个包含一个或者多个指令的文件可以放置在特定的文档目录中,同时指令会应用到该目录及该目录的所有子目录。


注释:

如果你想将你的.htaccess叫成其它名字,你可以使用 AccessFileName指令来修改该名称。比如,假如你想要把这个文件叫做.config,可以将如下内容放到服务器配置文件中:

    AccessFileName   .config


通常,.htaccess文件使用和主配置文件相同的语法。你可以在这些.htaccess文件中放入什么内容取决于AllowOverride指令。在策略上,AllowOverride指令指定了哪些在.htaccess文件中发现的指令可以产生作用(英文中使用了be honored,此处应该理解为产生作用,编者注)。如果一个指令允许出现在.htaccess文件中,那么该指令的说明文档将会包含一个Override项目,该项指定了为了这个指令可以在.htaccess文件中被执行,AllowOverride后面应该加上什么样的值。


比如,如果你查阅AddDefaultCharset指令的说明文档,你会发现该指令可以出现在.htaccess文件中。(看在指令概览中的上下文行(Context line)。)Override行记录的是FileInfo。如此,你至少要有AllowOverride  FileInfo来确保出现在.htaccess文件中的AddDefaultCharset指令会得到执行。

样例:

        Context: server config,virtual host,directory,.htaccess

        Override: FileInfo


如果你不确定一个特定的指令是否允许出现在.htaccess文件中,查询指令的说明文档,检查Context行中是否含有“.htaccess”。


何时使用或者不使用.htaccess文件


通常情况,仅当你无法访问主服务器配置文件(http.conf编者注)时才使用.htaccess文件。比如,有一种普遍的错误想法,用户认证总应该在.htaccess文件中处理,并且,最近几年,另外一种mod_rewrite类指令必须写进.htaccess文件中的错误认识也出现了。情况根本不是这样。你可以把用户认证配置放在主服务器配置中,实际上,这样处理是首选的方式。同样地,在主配置服务器配置中的mod_rewrite指令在诸多方面也会工作的更好。


.htaccess文件应该在如下情况中使用,文件内容提供者需要基于每目录的将配置修改到服务器上,但是没有服务器系统的访问权限。在系统管理员不希望做出频繁配置修改的情形中,允许个体用户在.htaccess文件中为其自己做出配置修改就是一件合意的事情。比如,这样的一种真实情况,ISP商总是把多个用户的网站集中到一个单独的机器上,同时希望用户可以更改自己的配置。


但是,普遍上来说,如果可能的话应该尽力避免使用.htaccess文件。任何考虑放在.htaccess文件中的配置,都可以更有效地配置在主服务器配置文件的<Directory>章节中。


避免使用.htaccess文件的主要原因有2个。


第一个是性能。当AllowOverride设置为允许使用.htaccess文件时,httpd为.htaccess文件每个目录查看每个目录 。如此,允许.htaccess文件会产生性能碰撞,无论你是否实际上使用的它们!而且,.htaccess文件在每次文档请求的时候都会被载入。


进一步地注意,httpd必须在所有的上层目录查阅.htaccess文件,以便获得其必须应用的全部指令。(See section on how directives are applied.)这样,假如/www/htdocs/example目录中的文件得到请求,httpd必须搜索如下文件:

/.htaccess

/www/.htaccess

/www/htdocs/.htaccess

/www/htdocs/example/.htaccess


这样,对于在该目录中每个文件的访问,会有4次额外的文件系统访问,即使每次额外的访问都找不到任何文件。(注意,只有当.htaccess文件对/启用的时候,才会有这种情况,通常情况下都不会做这样的设定。)


在使用RewriteRule指令的情形中,.htaccess上下文中的正则表达式对指向该目录的每个请求都会重新编译,然而,在主服务器配置环境中的正则表达式只需编译一次同时缓存。此外,表达式的规则自身要更为复杂,每个规则总是伴随每个目录环境和mod_rewrite所带来的限制运作。咨询Rewrite Guide来获得关于这个主题的更多细节。


第二个考虑是安全。如果你允许用户可以修改服务器配置,这样可能会产生超出你控制的更改所带来的结果。谨慎地考虑是否希望给予用户这样的特权。同样要注意,给予用户更少的权限会导致额外的技术支持请求。确保清晰明了的告知用户已经赋予了他们什么等级的权限。准确地指定AllowOverride要设定的值,把这些值指向有关的说明文档,将在以后解决你的许多迷惑。


注意,把包含某一指令的.htaccess文件放在目录/www/htdocs/example中和把相同指令放在主服务器配置的Directory章节<Directory /www/htdocs/example>中是完全等价的。


在/www/htdocs/example的.htaccess文件:

        在/www/htdocs/example的.htpaccess文件中的内容

        AddType  text/example  .exm

        来自于httpd.conf文件中的部分

        <Directory /www/htdocs/example>

            AddType  text/example  .exm

        <Directory>


但是,将该配置放入服务器配置文件中将降低性能冲突,因为服务器配置文件是在httpd启动时加载一次,而不是每次文件请求时加载。


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

        AllowOverride  none


指令是如何应用的


在.htaccess文件中发现的配置指令应用到该发现该文件的目录,及其所有的子目录。但是,记住重要的一点,在高层的目录中也可能会有.htpasswd文件。指令按照找到的顺序来应用。因而,在某一特定目录中的.htaccess文件能够覆盖目录树中在高一级目录的.htaccess里找到的指令。指令可以覆盖高一级目录中的指令,依次类推,在主服务器配置文件中定义的亦是如此。


样例:

在目录/www/htdocs/example1中我们包含如下内容的.htaccess文件:

        Option  +ExecCGI


(注意,必须设定“AllowOverride Options”以使得.htpaccess文件中的Option指令起作用。)


在目录/www/htdocs/example1/example2中我们包含如下内容的.htaccess文件

        Option  Includes


由于第二个.htaccess文件,在目录/www/htdocs/example1/example2中,CGI执行是不被允许的,因为只有Options Includes会期作用,任何之前的设定都会被完全覆盖掉。


.htaccess同主配置文件的淹没(merging,编者注)

就像在同配置章节相关说明文档中谈论的那样,.htaccess文件可以覆盖为同样目录配置的<Directory>章节,但是会被主配置文件中其它类型的章节所覆盖。这种事实可以用来强制某种特定配置,即使是在自由AllowOverride设定的情形下。比如,当允许在.htaccess中做任何设定时,为了组织脚本执行,你可以使用:

        <Directory  />

            AllowOverride  All

        </Directory>

        

        <Location  />

            Options  +IncludesNoExec  -ExecCGI

        </Location>


认证样例


如果你直接跳转到该说明文档的这个部分来找出如何处理认证,重要的是注意一点。要求你使用.htaccess文件来完善密码认证是一种普遍的错误认识。根本就不是这样。在你的主服务器配置文件中,将认证指令放到<Directory>章节,完善此项的首选方法,同时,只有当你无法访问主服务器配置文件时才应该使用.htaccess文件。查看以上你应该何时使用和不使用.htaccess文件的讨论内容。


话虽如此,如果你仍旧认为需要是使用.htaccess文件,如下的配置可能对你有用。


.htaccess文件内容:

        AuthType  Basic

        AuthName  "Password Required"

        AuthUserFile  /www/passwords/passwd.file

        AuthGroupFile  /www/passwords/group.file

        Require  Group  admins


注意,AllowOverride  AuthConfig必须生效,以使得这些指令可以起作用。


请看认证教程以获得更完整的认证和授权方面的讨论。


服务器端引用样例(Server Side Includes)


另外一种.htaccess文件的普遍使用是为特定的目录启用服务器端应用功能。这可以使用如下的配置指令来处理,指令需要放在期望目录的.htaccess文件中:

        Options  +Includes

        AddType  text/html  shtml

        AddHandler  server-parsed  shtml


注意,AllowOverride Options和AllowOverride FileInfo务必全部生效,以便这些指令产生影响。


请查看SSI教程获得更多完整的服务器端引用的讨论。


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


在这个案例中,错误信息指向了你所犯的特定语法错误。



你可能感兴趣的:(apache,httpd,.htaccess)