引言
.htaccess 文件用于 Apache web server,作为一种无需更改服务器配置文件即可配置网站细节的方法。此文件以句点开头,表示它在文件夹中是隐藏的。.htaccess 文件可用于加载自定义错误页面(如 404 页面)、创建 URL 重定向、为服务器上特定目录实现密码保护认证等。
在本教程中,您将学习如何启用、创建和使用 .htaccess 文件,以及一些常见用法及其对速度和安全性的影响。
关键要点
- .htaccess 是每个目录的覆盖文件:Apache 在每次请求时读取
.htaccess文件,以应用该目录及其子目录的配置,而无需更改主服务器配置。 - 必须启用 AllowOverride:Apache 仅在相关
<Directory>块将AllowOverride设置为非None值时才认可.htaccess规则,例如使用AllowOverride All来启用您想要的功能。 - 在共享主机和权限受限环境中使用 .htaccess:在无法编辑主 Apache 配置的服务器上,
.htaccess为网站所有者提供了管理重定向、mod_rewrite 规则、认证和其他目录特定行为的方法。 - 现代 Apache 2.4 使用 Require 替代 Allow 或 Deny:旧版的
Allow from和Deny from指令已在 Apache 2.4 中被Require语法取代,因此新配置应依赖Require all granted及相关指令。 - 优先使用主配置:在您控制的服务器上,Apache 建议将永久规则置于主配置文件中,以获得更好的性能和更简单的调试,仅在需要用户级覆盖时使用
.htaccess。
前提条件
如果您想通过跟随本教程中的示例来练习使用 .htaccess 文件,您需要:
-
一台已设置好的 Ubuntu 服务器,配置了非 root 用户并具有
sudo权限,且已启用防火墙。您可以按照 Ubuntu 初始服务器设置指南来完成此操作。 -
在您的 Ubuntu 服务器上安装了 Apache web server。您可以参考我们的教程《在 Ubuntu 上安装 Apache Web Server》来设置。请确保完成 第 5 步,并为您的域名创建一个虚拟主机文件。本教程将全程以 your_domain 为例,并使用
/etc/apache2/sites-available/your_domain.conf作为虚拟主机文件。 -
如果您想使用域名进行练习(可选),可以通过在 Namecheap 上购买域名,或使用您选择的域名注册商来设置。您还需要为服务器设置以下两条 DNS 记录:两条 A 记录,一条指向
your_domain,另一条指向www.your_domain,均指向服务器的公网 IP 地址。请参考 DNS 介绍以了解如何添加这些记录。 -
如果您还想为虚拟主机添加安全保护,可以使用免费的可信证书,例如我们的 Apache Let’s Encrypt 指南。不过,如果您没有域名,可以改用自签名证书。它提供相同类型的加密,但无需域名验证。请参考我们的 Apache 自签名 SSL 指南来设置。
设置完成后,您可以在接下来的步骤中练习启用和创建 .htaccess 文件。
启用 .htaccess 文件
.htaccess 文件如果您有权访问服务器设置,可以编辑 Apache 配置以允许 .htaccess 文件覆盖标准网站配置。
首先,使用您喜欢的文本编辑器打开 apache2/sites-available/your_domain.conf 虚拟主机文件。这里我们使用 nano:
- sudo nano /etc/apache2/sites-available/your_domain.conf
假设您遵循了先决条件 Apache 安装指南的第 5 步,该文件将包含以下内容:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
在 VirtualHost 块内添加以下 Directory 内容块,以启用 .htaccess 使用:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/your_domain>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
</VirtualHost>
这个 Directory 内容块中最重要的一行是 AllowOverride All,它启用了 .htaccess 文件的使用。这里保留了旧版的 Order 和 allow 指令以确保兼容性,而 Require all granted 行反映了推荐的 Apache 2.4 语法。添加这些信息后,保存并关闭文件。如果您使用 nano,可以按 CTRL + X,然后 Y 和 ENTER 来完成。
接下来,重启 Apache:
sudo service apache2 restart
现在您的配置设置已更新以允许使用 .htaccess 文件,在下一步中您将创建一个这样的文件。
创建 .htaccess 文件
.htaccess 文件要在终端中为您的网站创建 .htaccess 文件,需要导航到您的 web 根目录。web 根目录是放置 .htaccess 文件的位置,以便您的配置能够为网站正确执行。.htaccess 文件的正确放置非常重要,因为该文件中的配置会影响其目录及其后续目录中的所有内容。这意味着如果您在同一 Apache 服务器上托管多个不同网站,则每个网站的 .htaccess 文件应放置在其特定的 web 根目录中。
如果您遵循了先决条件,您的 web 根目录将位于以下位置:/var/www/your_domain/.htaccess。要为您的网站创建 .htaccess 文件,请运行以下命令:
sudo nano /var/www/your_domain/.htaccess
现在您已经学会了创建 .htaccess 文件的几种方法,接下来我们将回顾 .htaccess 文件的一些常见用法。
.htaccess 页面的常见用途
.htaccess 页面的常见用途网站上 .htaccess 页面的五种常见用途:
Mod_Rewrite
.htaccess 文件最有用的方面之一是 mod_rewrite。您可以使用 .htaccess 文件来指定和更改网站上 URL 和网页向用户显示的方式。至少,重写配置需要 RewriteEngine On 和一行或多行 RewriteRule。了解更多信息,请阅读我们的教程《如何设置 mod_rewrite》。
身份验证
要使用 .htaccess 设置安全身份验证,您可以创建一个名为 .htpasswd 的密码文件来验证用户。此更改将创建一个密码门户,如果访客想要访问网页的某些部分,则会提示他们输入密码。创建此文件时,请确保出于安全原因将其存储在 web 目录之外的位置。
要创建该文件,请运行 htpasswd 命令并包含 -c 选项,以及要创建指定 htpasswd 文件的用户名。一旦执行,系统会提示您提供密码。您可以向 htpasswd 文件中插入任意多行,但请确保每个用户都有各自对应的行。以下示例说明了如何为用户 sammy 创建一个新条目:
sudo htpasswd -c /etc/apache2/.htpasswd sammy
您可以通过运行 cat /etc/apache2/.htpasswd 来检查该文件的内容,它将输出您添加的每个记录的用户名和加密密码。
添加所需用户后,接下来打开 .htaccess 文件。如果您遵循了先决条件指南,该文件将位于以下位置:
sudo nano /var/www/your_domain/.htaccess
请注意,在此示例中,我们基于 /var/www/your_domain 限制了整个文档根目录,但您可以将它放置在任何想要限制访问的目录中。
打开该文件后,添加以下内容并保存更改以开始使用密码功能:
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
了解更多信息,请阅读我们的教程《如何使用 Apache 设置密码身份验证》。
自定义错误页面
.htaccess 文件还允许您为网站创建自定义错误页面。一些最常见的错误包括:
- 400 Bad Request
- 401 Authorization Required
- 403 Forbidden Page
- 404 File not Found
- 500 Internal Error
为了使页面更友好,并为网站访客提供比默认服务器错误页面更多的信息,您可以使用 .htaccess 文件创建自定义错误页面。
MIME 类型
如果您的网站包含一些服务器未配置为提供的应用程序文件,您可以在 .htaccess 文件中使用以下代码向 Apache 服务器添加 Multipurpose Internet Mail Extensions (MIME) 类型:
AddType audio/mp4a-latm .m4a
请确保将应用程序和文件扩展名替换为您想要支持的 MIME 类型。在此示例中,我们指定了一个音频文件 MIME 类型。
SSI
服务器端包含 (SSI) 是网站上的巨大时间节省器。SSI 最常见的用途之一是使用特定数据更新大量页面,而无需逐个更新每个页面。例如,如果您想更改页面底部的引言。
要启用 SSI,请将以下代码插入到您的 .htaccess 文件中:
AddType text/html .shtml
AddHandler server-parsed .shtml</pre>
这些行告诉 .htaccess,.shtml 文件是有效的,第二行特别让服务器解析所有以 .shtml 结尾的文件中的任何 SSI 命令。
但是,如果您有许多 .html 页面而不愿将其重命名为 .shtml 扩展名,您可以使用另一种策略来解析它们中的 SSI 命令,即 XBitHack。
您可以通过将以下行添加到 .htaccess 文件中使用此 XBitHack 策略,从而让 Apache 检查所有具有适当权限的 .html 文件中的 SSI:
XBitHack on
要使页面符合 XBitHack,请使用 chmod 命令更改权限:
chmod +x pagename.html
现在您已经了解了 .htaccess 页面的几种常见用途,接下来您将了解 .htaccess 文件对速度和安全性的影响,以及如何排查常见错误。
使用 .htaccess 文件提升速度和安全性
.htaccess 文件提升速度和安全性尽管 .htaccess 文件可以用来改进网站,但需要注意它可能会影响两方面:速度和安全性。
关于速度,.htaccess 文件可能会减慢服务器速度,但对于大多数服务器来说,这种变化可能几乎察觉不到。这可能是因为页面位置的原因,因为 .htaccess 文件会影响其所在目录及其后续所有目录中的页面。这意味着每次页面加载时,服务器都会扫描其目录以及之前的任何目录,直到到达最高级目录或一个 .htaccess 文件。只要 AllowOverride 指令允许使用 .htaccess 文件,这个过程就会发生。
关于安全性,.htaccess 文件比标准的 Apache 配置更容易访问,而且更改会立即生效(无需重启服务器)。这允许用户在 .htaccess 文件中进行修改,从而赋予他们对服务器本身的很大控制权。放置在 .htaccess 文件中的任何指令,都会产生与在 Apache 配置本身中相同的效果。还需要注意的是,如果用户可以直接访问 Apache 配置文件,Apache 通常不鼓励使用 .htaccess。
对于您直接管理的服务器,一个好的模式是将永久规则放在主 Apache 配置中,并将 .htaccess 文件保留给站点级管理员需要在不重载 Web 服务器的情况下管理自己的设置的情况。
排查常见的 .htaccess 错误
.htaccess 错误因为 .htaccess 文件在每个请求中都会被解析,一个小的语法错误就可能导致网站出现明显的错误。以下是一些常见问题及其排查方法。
1. 编辑 .htaccess 后出现 500 内部服务器错误
如果在添加或更改 .htaccess 规则后立即看到 500 内部服务器错误,可能是 Apache 由于无效语法或禁用的模块而拒绝了该文件。
- 检查 Apache 错误日志以获取详细信息:
sudo tail -n 50 /var/log/apache2/error.log
- 查找引用
.htaccess、RewriteRule或未知指令的消息。 - 确认
mod_rewrite或其他引用的模块已启用,使用sudo a2enmod rewrite后跟sudo systemctl reload apache2。 - 如果不确定哪一行导致了问题,暂时注释掉新规则,然后逐个添加回来。
2. .htaccess 规则被完全忽略
如果您的 .htaccess 更改似乎被忽略,最常见的原因是 AllowOverride 未设置为允许您使用的指令。
- 确认站点的
<Directory>块包含AllowOverride All或包含正确覆盖范围的值。 - 确保
.htaccess文件位于 Apache 服务的目录中。对于基于 Ubuntu 的 Apache 安装和基于名称的虚拟主机,这通常是/var/www/your_domain。 - 检查文件权限,确保 Apache 可以读取该文件,例如使用
sudo ls -l /var/www/your_domain/.htaccess。
3. 重定向循环和意外的重写行为
复杂的重写规则很容易导致重定向循环或意外的状态码,如果测试条件未按预期匹配。
- 如果只需要基本的路径或主机重定向,先从简单的
Redirect指令开始,然后再转向RewriteRule。 - 当使用
mod_rewrite时,从单个规则开始,并在受限环境中测试其行为,然后再应用到整个站点。 - 使用浏览器的网络检查器或工具如
curl -I来查看调试重定向链时的响应码和Location头部。
常见问题解答
1. .htaccess 文件用于什么?
.htaccess 文件是一个每个目录的配置文件,Apache 在每次请求时读取它,以调整该目录及其子目录的行为。您可以使用它来执行诸如 URL 重写、重定向、访问控制、身份验证以及自定义错误页面等任务,当您不想或无法编辑主要的 Apache 配置文件时。
2. .htaccess 文件位于哪里?
Apache 会在每个由启用了 AllowOverride 的 <Directory> 或 <Location> 块覆盖的目录中查找 .htaccess。在基于 Ubuntu 的 Apache 服务器上配置了基于名称的虚拟主机时,您通常将文件放置在文档根目录中,例如 /var/www/your_domain。在共享主机上,该文件通常位于您站点的 public_html 目录中。
3. 为什么我的 .htaccess 文件不起作用?
如果您的 .htaccess 文件似乎没有任何效果,通常是因为该目录的 AllowOverride 设置为 None,或者文件不在 Apache 实际服务的目录中。请确认虚拟主机配置中的 <Directory> 路径,检查 AllowOverride 是否允许您使用的指令,并验证文件是否可被 Web 服务器用户读取。查看 Apache 错误日志也可以帮助您发现语法问题。
4. .htaccess 会影响性能吗?
是的,.htaccess 会影响性能,因为当启用了 AllowOverride 时,Apache 必须在每个请求时沿着路径检查每个目录中的 .htaccess 文件。在大多数站点上,这种开销很小,但在高流量服务器或复杂目录结构上,额外的文件系统检查可能会累积。当您控制服务器配置时,Apache 建议将永久规则移入主配置文件中,以避免这种成本。
5. 不用 Apache 也可以使用 .htaccess 吗?
.htaccess 机制是 Apache HTTP Server 特有的,其他 Web 服务器如 Nginx 或 Caddy 不会处理它。这些服务器有自己的配置格式,用于每个站点或每个位置的规则。如果您将站点从 Apache 迁移到另一个 Web 服务器,则需要将相关的 .htaccess 指令翻译成该服务器的原生配置。
结论
.htaccess 文件为您构建站点提供了极大的灵活性。要了解更多关于保护站点的知识,请阅读我们关于使用 Apache 设置密码身份验证的教程。您还可以阅读我们关于安装 Apache Web 服务器以及特别是重要的 Apache 文件和目录的教程。
如果您正在较新的 Ubuntu 发行版上配置 Apache 或使用 PHP 构建动态应用程序,您可能还会发现这些教程很有帮助:
- 如何在 Ubuntu 上安装 Apache Web 服务器
- 如何在 Ubuntu 上安装 Linux、Apache、MySQL、PHP (LAMP)
- 如何在 Ubuntu 上使用 Let’s Encrypt 保护 Apache
- 如何在 Debian 上使用 Let’s Encrypt 保护 Apache