# .htaccess文件
`.htaccess`文件提供了针对每个目录改变配置的方法。
## .htaccess 文件
相关模块
* `core`
* `mod_authn_file`
* `mod_authz_groupfile`
* `mod_cgi`
* `mod_include`
* `mod_mime`
相关指令
* `AccessFileName`
* `AllowOverride`
* `Options`
* `AddHandler`
* `SetHandler`
* `AuthType`
* `AuthName`
* `AuthUserFile`
* `AuthGroupFile`
* `Require`
## 工作原理和使用方法
`.htaccess`文件(或者"分布式配置文件")提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。
### 说明:
如果需要使用`.htaccess`以外的其他文件名,可以用`AccessFileName`指令来改变。例如,需要使用`.config` ,则可以在服务器配置文件中按以下方法配置:
```
AccessFileName .config
```
通常,`.htaccess`文件使用的配置语法和[主配置文件](#calibre_link-327)一样。`AllowOverride`指令按类别决定了`.htaccess`文件中哪些指令才是有效的。如果一个指令允许在`.htaccess`中使用,那么在本手册的说明中,此指令会有一个[覆盖项](#calibre_link-20)段,其中说明了为使此指令生效而必须在`AllowOverride`指令中设置的值。
例如,本手册对`AddDefaultCharset`指令的阐述表明此指令可以用于`.htaccess`文件中(见"作用域"项),而[覆盖项](#calibre_link-20)一行是`FileInfo` ,那么为了使`.htaccess`中的此指令有效,则至少要设置 `AllowOverride FileInfo` 。
### 例子:
| [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess |
| --- | --- |
| [覆盖项](#calibre_link-66) | FileInfo |
如果不能确定某个指令是否可以用于`.htaccess`文件,可以查阅手册中对指令的说明,看在"作用域"行中是否有".htaccess" 。
## (不)使用.htaccess文件的场合
一般情况下,不应该使用`.htaccess`文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过`.htaccess`文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。
`.htaccess`文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过`.htaccess`文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。
虽然如此,一般都应该尽可能地避免使用`.htaccess`文件。任何希望放在`.htaccess`文件中的配置,都可以放在主配置文件的`<Directory>`段中,而且更高效。
避免使用`.htaccess`文件有两个主要原因。
首先是性能。如果`AllowOverride`启用了`.htaccess`文件,则Apache需要在每个目录中查找`.htaccess`文件,因此,无论是否真正用到,启用`.htaccess`都会导致性能的下降。另外,对每一个请求,都需要读取一次`.htaccess`文件。
还有,Apache必须在所有上级的目录中查找`.htaccess`文件,以使所有有效的指令都起作用(参见[指令的生效](#calibre_link-329)),所以,如果请求`/www/htdocs/example`中的页面,Apache必须查找以下文件:
```
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
```
总共要访问4个额外的文件,即使这些文件都不存在。(注意,这可能仅仅由于允许根目录"`/`"使用`.htaccess` ,虽然这种情况并不多。)
其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。但是,如果给予用户较少的特权而不能满足其需要,则会带来额外的技术支持请求,所以,必须明确地告诉用户已经给予他们的权限,说明`AllowOverride`设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。
注意,在`/www/htdocs/example`目录下的`.htaccess`文件中放置指令,与在主配置文件中`<Directory /www/htdocs/example>`段中放置相同指令,是完全等效的。
`/www/htdocs/example`目录下的`.htaccess`文件:
### `/www/htdocs/example`目录下的.htaccess文件的内容:
```
AddType text/example .exm
```
### `httpd.conf`文件中摘录的内容:
```
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
```
但是,把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。
将`AllowOverride`设置为`none`可以完全禁止使用`.htaccess`文件:
```
AllowOverride None
```
## 指令的生效
`.htaccess`文件中的配置指令作用于`.htaccess`文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有`.htaccess`文件,而指令是按查找顺序依次生效的,所以一个特定目录下的`.htaccess`文件中的指令可能会覆盖其上级目录中的`.htaccess`文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
例子:
`/www/htdocs/example1`目录中的`.htaccess`文件有如下内容:
```
Options +ExecCGI
```
(注意:必须设置"`AllowOverride Options`"以允许在`.htaccess`中使用"`Options`"指令)
`/www/htdocs/example1/example2`目录中的`.htaccess`文件有如下内容:
```
Options Includes
```
由于第二个`.htaccess`文件的存在,`/www/htdocs/example1/example2`中的CGI执行是不允许的,而只允许 `Options Includes` ,它完全覆盖了之前的设置。
### 将.htaccess合并到主配置文件中
正如在[配置段(容器)](#calibre_link-256)中讨论的那样,`.htaccess`文件能够覆盖`<Directory>`段中对相应目录的设置,但是也同样会被主配置文件中其它类型的配置段所覆盖。这个特性可以用来强制实施某些配置,甚至在`AllowOverride`已经许可的情况下。举个例子来说,为了强迫在`.htaccess`中禁止脚本执行但不限制其它的情况下,可以这样:
```
<Directory />
Allowoverride All
</Directory>
<Location />
Options +IncludesNoExec -ExecCGI
</Location>
```
## 认证举例
如果你只是为了知道如何认证,而直接从这里开始看的,有很重要的一点需要注意,有一种常见的误解,认为实现密码认证必须要使用`.htaccess`文件,其实是不正确的。把认证指令放在主配置文件的`<Directory>`段中是一个更好的方法,而`.htaccess`文件应该仅仅用于无权访问主配置文件的时候。参见[上述](#calibre_link-330)关于何时应该与何时不应该使用`.htaccess`文件的讨论。
有此声明在先,如果你仍然需要使用`.htaccess`文件,请继续看以下说明。
`.htaccess`文件的内容:
```
AuthType Basic
AuthName "Password Required"
AuthUserFile /www/passwords/password.file
AuthGroupFile /www/passwords/group.file
Require Group admins
```
必须设置 `AllowOverride AuthConfig` 以允许这些指令生效。
更详细的说明,请参见[认证、授权、访问控制](#calibre_link-266)。
## 服务器端包含(SSI)举例
`.htaccess`文件的另一个常见用途是允许一个特定的目录使用服务器端包含(SSI),可以在需要的目录中放置`.htaccess`文件,并作如下配置:
```
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
```
注意,必须同时设置 `AllowOverride Options` 和 `AllowOverride FileInfo` 以使这些指令生效。
更详细的有关服务器端包含的说明,请参见[SSI指南](#calibre_link-267)。
## CGI举例
可以通过`.htaccess`文件允许在特定的目录中执行CGI程序,需要作如下配置:
```
Options +ExecCGI
AddHandler cgi-script cgi pl
```
另外,如下配置可以使给定目录下的所有文件被视为CGI程序:
```
Options +ExecCGI
SetHandler cgi-script
```
注意,必须同时设置 `AllowOverride Options` 和 `AllowOverride FileInfo` 以使这些指令生效。
更详细的有关CGI编程和配置的说明,请参见[CGI指南](#calibre_link-215)。
## 疑难解答
如果在`.htaccess`文件中的某些指令不起作用,可能有多种原因。
最常见的原因是`AllowOverride`指令没有被正确设置,必须确保没有对此文件区域设置 `AllowOverride None` 。有一个很好的测试方法,就是在`.htaccess`文件随便增加点无意义的垃圾内容,如果服务器没有返回了一个错误消息,那么几乎可以断定设置了 `AllowOverride None` 。
在访问文档时,如果收到服务器的出错消息,应该检查Apache的错误日志,可以知道`.htaccess`文件中哪些指令是不允许使用的,也可能会发现需要纠正的语法错误。
- Apache HTTP Server Version 2.2 文档 [最后更新:2006年3月21日]
- 版本说明
- 从1.3升级到2.0
- 从2.0升级到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 参考手册
- 编译与安装
- 启动Apache
- 停止和重启
- 配置文件
- 配置段(容器)
- 缓冲指南
- 服务器全局配置
- 日志文件
- 从URL到文件系统的映射
- 安全方面的提示
- 动态共享对象(DSO)支持
- 内容协商
- 自定义错误响应
- 地址和端口的绑定(Binding)
- 多路处理模块
- Apache的环境变量
- Apache处理器的使用
- 过滤器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重写指南
- Apache虚拟主机文档
- 基于主机名的虚拟主机
- 基于IP地址的虚拟主机
- 大批量虚拟主机的动态配置
- 虚拟主机示例
- 深入研究虚拟主机的匹配
- 文件描述符限制
- 关于DNS和Apache
- 常见问题
- 经常问到的问题
- Apache的SSL/TLS加密
- SSL/TLS高强度加密:绪论
- SSL/TLS高强度加密:兼容性
- SSL/TLS高强度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 认证、授权、访问控制
- CGI动态页面
- 服务器端包含入门
- .htaccess文件
- 用户网站目录
- 针对特定平台的说明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上编译Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服务器和支持程序
- httpd - Apache超文本传输协议服务器
- ab - Apache HTTP服务器性能测试工具
- apachectl - Apache HTTP服务器控制接口
- apxs - Apache 扩展工具
- configure - 配置源代码树
- dbmmanage - 管理DBM格式的用户认证文件
- htcacheclean - 清理磁盘缓冲区
- htdbm - 操作DBM密码数据库
- htdigest - 管理用于摘要认证的用户文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本认证的用户文件
- logresolve - 解析Apache日志中的IP地址为主机名
- rotatelogs - 滚动Apache日志的管道日志程序
- suexec - 在执行外部程序之前切换用户
- 其他程序
- 杂项文档
- 与Apache相关的标准
- Apache模块
- 描述模块的术语
- 描述指令的术语
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模块 mod_actions
- Apache模块 mod_alias
- Apache模块 mod_asis
- Apache模块 mod_auth_basic
- Apache模块 mod_auth_digest
- Apache模块 mod_authn_alias
- Apache模块 mod_authn_anon
- Apache模块 mod_authn_dbd
- Apache模块 mod_authn_dbm
- Apache模块 mod_authn_default
- Apache模块 mod_authn_file
- Apache模块 mod_authnz_ldap
- Apache模块 mod_authz_dbm
- Apache模块 mod_authz_default
- Apache模块 mod_authz_groupfile
- Apache模块 mod_authz_host
- Apache模块 mod_authz_owner
- Apache模块 mod_authz_user
- Apache模块 mod_autoindex
- Apache模块 mod_cache
- Apache模块 mod_cern_meta
- Apache模块 mod_cgi
- Apache模块 mod_cgid
- Apache模块 mod_charset_lite
- Apache模块 mod_dav
- Apache模块 mod_dav_fs
- Apache模块 mod_dav_lock
- Apache模块 mod_dbd
- Apache模块 mod_deflate
- Apache模块 mod_dir
- Apache模块 mod_disk_cache
- Apache模块 mod_dumpio
- Apache模块 mod_echo
- Apache模块 mod_env
- Apache模块 mod_example
- Apache模块 mod_expires
- Apache模块 mod_ext_filter
- Apache模块 mod_file_cache
- Apache模块 mod_filter
- Apache模块 mod_headers
- Apache模块 mod_ident
- Apache模块 mod_imagemap
- Apache模块 mod_include
- Apache模块 mod_info
- Apache模块 mod_isapi
- Apache模块 mod_ldap
- Apache模块 mod_log_config
- Apache模块 mod_log_forensic
- Apache模块 mod_logio
- Apache模块 mod_mem_cache
- Apache模块 mod_mime
- Apache模块 mod_mime_magic
- Apache模块 mod_negotiation
- Apache模块 mod_nw_ssl
- Apache模块 mod_proxy
- Apache模块 mod_proxy_ajp
- Apache模块 mod_proxy_balancer
- Apache模块 mod_proxy_connect
- Apache模块 mod_proxy_ftp
- Apache模块 mod_proxy_http
- Apache模块 mod_rewrite
- Apache模块 mod_setenvif
- Apache模块 mod_so
- Apache模块 mod_speling
- Apache模块 mod_ssl
- Apache模块 mod_status
- Apache模块 mod_suexec
- Apache模块 mod_unique_id
- Apache模块 mod_userdir
- Apache模块 mod_usertrack
- Apache模块 mod_version
- Apache模块 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航