.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
  • 如果有权访问 httpd 主服务器配置文件,则应该完全避免使用 .htaccess 文件。
  • 使用 .htaccess 文件会降低 Apache http 服务器的速度。可以包含在 .htaccess 文件中的任何指令都可以在,<Directory> 块中更好地设置,因为它具有相同的效果和更好的性能。

.htaccess 文件使用方法


  • .htaccess文件(或者 “分布式配置文件” ) 提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。

!注意: 如果要将 .htaccess 文件调用为其他内容,可以使用该 AccessFileName 指令更改文件名。

  • 通常,.htaccess 文件使用的配置语法和 主配置文件 一样。
  • AllowOverride 指令按类别决定了 .htaccess 文件中哪些指令才是有效的.
  • 如果一个指令允许在 .htaccess 中使用,则该指令的文档将包含“覆盖”部分,指定必须包含的值才能 AllowOverride 允许该指令。

例如,如果查看该 AddDefaultCharset 指令的文档,您会发现它在 .htaccess 文件中是允许的。(请参阅指令摘要中的Context行。)Override 行读取 FileInfo。因此,您必须至少 AllowOverride FileInfo为了使该指令在.htaccess文件中得到尊重。

!注意 .htaccess 文件不推荐使用


  • 一般情况下,不应该使用 .htaccess文件,除非你对主配置文件没有访问权限。
  • 有一种很常见的误解,认为用户认证只能通过 .htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。
  • .htaccess 文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下
  • 如果服务器管理员不愿意频繁修改配置,则可以允许用户通过 .htaccess 文件自己修改配置,尤其是ISP 在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。
  • 虽然如此,一般都应该 尽可能地避免使用 .htaccess文件。任何希望放在 .htaccess文件中的配置,都可以放在主配置文件的 <Directory> 段中 ,而且更高效。

避免使用.htaccess文件有两个主要原因

  1. 首先是性能。如果 AllowOverride 启用了 .htaccess文件,则Apache需要在每个目录中查找 .htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。
  2. Apache 必须在所有上级的目录中查找 .htaccess文件,以使所有有效的指令都起作用 (参见指令的生效),所以,如果请求 /use/local/apache/htdocs/example 中的页面,Apache必须查找以下文件:

    • 对于 RewriteRule 指令,在 .htaccess 上下文中,必须使用对目录的每个请求重新编译这些正则表达式,而在主服务器配置上下文中,它们被编译一次并缓存。
    • 此外,规则本身更复杂,因为必须解决每个目录上下文带来的限制 mod_rewrite。有关此主题的更多详细信息,请参阅“ 重写指南 
    • 其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。
    • 但是,如果给予用户较少的特权而不能满足其需要,则会带来额外的技术支持请求,所以,必须明确地告诉用户已经给予他们的权限,说明 AllowOverride 设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。

!注意 在 /use/local/apache/htdocs/example 目录下的 .htaccess 文件中放置指令,与在主配置文件中 <Directory /use/local/apache/htdocs/example> 段中放置相同指令,是完全等效的。

  • /use/local/apache/example 目录下的 .htaccess 文件:

如何应用指令


  • .htaccess 文件中的配置指令作用于 .htaccess 文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess 文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess 文件中的指令可能会覆盖其上级目录中的 .htaccess 文件中的指令即子目录中的指令会覆盖父目录或者主配置文件中的指令。
  • 例子:

!注意:必须设置 “AllowOverride Options” 以允许在 .htaccess 中使用 “Options” 指令

  • /use/local/apache/htdocs/example1/example2 目录中的 .htaccess 文件有如下内容:

将 .htaccess 合并到主配置文件中

  • 正如在 配置段(容器) 中讨论的那样,.htaccess文件能够覆盖 <Directory> 段中对相应目录的设置,但是也同样会被主配置文件中其它类型的配置段所覆盖。这个特性可以用来强制实施某些配置,甚至在 AllowOverride 已经许可的情况下。
  • 列如,为了强迫在 .htaccess 中禁止脚本执行但不限制其它的情况下,可以这样:
  • 假设 DocumentRoot 是 /use/local/apache/htdocs

  • 验证示例
  • 如果你只是为了知道如何验证,而直接从这里开始看的,有很重要的一点需要注意,有一种常见的误解,认为实现密码认证必须要使用.htaccess文件,其实是不正确的。
  • 把认证指令放在主配置文件的 <Directory> 段中是一个更好的方法,而 .htaccess 文件应该仅仅用于无权访问主配置文件的时候。参见上述关于 何时应该与何时不应该使用.htaccess文件的讨论
  • 如果仍然需要使用 .htaccess 文件,请继续看以下说明。
  • 有关 身份验证 和授权的更完整讨论,请参阅 身份验证教程

  • 服务器端包含 SSI 示例
  • .htaccess文件的另一个常见用途是允许一个特定的目录使用服务器端包含 (SSI)。可以在需要的目录中放置.htaccess文件,并作如下配置:

  • 更详细的有关服务器端包含的说明,请参见 SSI 教程。

  •  .htaccess 文件中重写规则

  • RewriteRule(重写规则) 在 .htaccess 文件中使用时 ,请注意每个目录的上下文会稍微改变一下。特别是,规则被认为是相对于当前目录,而不是原始请求的URI。

  • 有关使用的更多详细信息,请参阅 mod_rewrite 文档 mod_rewrite。

  • 请考虑以下示例:

  • CGI 示例
  • 可以通过 .htaccess 文件允许在特定的目录中执行 CGI 程序,需要作如下配置:

  • 另外,如下配置可以使指定目录下的所有文件被视为 CGI 程序:

  • 注意,必须同时设置 AllowOverride Options 和 AllowOverride FileInfo 以使这些指令生效。
  • 更详细的有关CGI编程和配置的说明,请参见 CGI指南

故障排除

如果在.htaccess文件中的某些指令不起作用,可能有多种原因。

 AllowOverride 指令没有被正确设置,必须确保没有对此文件区域设置 AllowOverride None 。有一个很好的测试方法,就是在 .htaccess 文件随便增加点无意义的垃圾内容,如果服务器没有返回了一个错误消息,那么几乎可以断定设置了 AllowOverride None

在访问文档时,如果收到服务器的出错消息,应该检查Apache的错误日志,可以知道.htaccess文件中哪些指令是不允许使用的,也可能会发现需要纠正的语法错误。

发表评论