浅谈.htaccess文件

.htaccess文件提供了一种目录级别的修改配置的方式。

NOTE:
如果你拥有修改apache配置文件的权限,那么完全没有必要使用.htaccess文件。使用.htaccess文件会拖慢apache的性能。所有允许出现在.htaccess文件中的配置指令都可以设置在apache配置文件中的Directory块中,不仅拥有相同的作用而且具有更好的性能。

.htaccess是什么?如何使用.htaccess文件?
.htaccess文件提供了一种目录级别的修改配置的方式。一个文件,包含一条或多条配置指令,放置于目录下,这些配置指令对当前目录和其所有子目录生效。

NOTE:
如果你想修改.htaccess文件的文件名,可以使用AccessFileName指令来定义新的文件名。例如,如果你想将.htaccess改成.config,那么只需要将以下指令加入apache的配置文件即可:

1
AccessFileName ".config"

通常来说,.htaccess的语法和apache的主配置文件语法一致。在.htaccess文件中的指令是否生效于AllowOverride级别密切相关。
以AddDefaultCharset(http://httpd.apache.org/docs/2.4/mod/core.html#adddefaultcharset)指令来说:
Context: server config, virtual host, directory, .htaccess 表示AddDefaultCharset是可以在.htaccess文件中设置的
Override: FileInfo 表示要使.htaccess中的AddDefaultCharset指令生效,那么相关目录的AllowOverride至少需要FileInfo权限

如果你不确定一个指令是否被允许在.htaccess文件的使用,那么可以查看这条指令的文档中的Context信息。

什么时候使用.htaccess文件?什么时候不要用?
通常来说,只有当你没有修改apache配置文件权限的时候才需要使用.htaccess文件。

一个普遍的误解是user authentication(用户验证)应该在.htaccess文件中完成;
另一个误解是mod_rewrite指令必须在.htaccess文件中设置。

以上两点是完全不正确的,你可以把user authentication(用户验证)放在apache的主配置文件里,并且推荐这样做。同样的,mod_rewrite指令在主配置文件里工作的更好(绝大多数方面上)。

.htaccess文件应该被应用于内容提供者需要配置满足各个文件目录各不相同的要求,并且没有root权限。系统管理员不乐意频繁更改配置,那么允许独立的用户在.htaccess文件中对配置进行更改就很有必要了。

无论如何,通常来说,应该尽量避免使用.htaccess文件。任何你考虑将要放置于.htaccess文件中的配置,都可以放置在主配置文件中的块中。

为何需要避免使用.htaccess文件?这里有两个主要原因
1. 性能。
2. 安全。

把.htaccess文件放置于/www/htdocs/example目录下,和主配置文件中的 ,所起的作用完全一致。

1
2
Contents of .htaccess file in /www/htdocs/example
AddType text/example ".exm"
1
2
3
4
Section from your httpd.conf file
<Directory "/www/htdocs/example">
    AddType text/example ".exm"
</Directory>

将AllowOverride改成none可以完全屏蔽.htaccess文件

1
AllowOverride None

配置指令是如何被接收的?
一个.htaccess文件中的配置指令会应用于.htaccess文件的当前目录以及所有子目录。然而,不要忘了可能还有更上层的文件目录中的.htaccess文件。配置指令按照它们被发现的顺序被应用。因此,一个.htaccess文件中的配置指令可能会覆盖更上层的.htaccess文件,以及apache的主配置文件中的配置指令。

.htaccess与主配置文件合并
.htaccess文件可以覆盖主配置文件中的配置指令,但是却会被主配置文件中的其他种类的配置锁覆盖。这个特性可以用来“强化”那些不希望被.htaccess覆盖的配置,无论是否具有宽泛的AllowOverride设置。例如,想要禁止脚本执行,不管.htaccess文件如何设置,可以使用:

1
2
3
4
5
6
7
<Directory "/www/htdocs">
    AllowOverride All
</Directory>

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>

这个例子假设你的DocumentRoot是/www/htdocs。

Authentication(用户认证)示例

.htaccess文件内容:

1
2
3
4
5
AuthType Basic
AuthName "Password Required"
AuthUserFile "/www/passwords/password.file"
AuthGroupFile "/www/passwords/group.file"
Require group admins

注意,要使以上指令生效需要AllowOverride AuthConfig权限。

Server Side Includes 示例
.htaccess文件的另一个常用需求是开启服务端包含指定目录。将.htaccess文件放置于想要的目录中:

.htaccess文件内容:

1
2
3
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml

注意: 以上配置指令需要AllowOverride Options和AllowOverride FileInfo

.htaccess文件中的Rewrite Rules
使用.htaccess来创建Rewrite Rule时需要注意每一个目录上下文都会有一点点更改。原始的URI会变成相对于当前目录,请看一下示例:

1
2
3
4
5
6
7
8
# 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文件中,开头的斜杠被去掉了,并且在images子目录中,/images/也被去掉了。