被广泛应用的 Apache httpd 网站环境,自带 .htaccess 文件(分布式配置文件)可以让管理员自定义网站的部分特殊功能。如我们日常遇到的:网站伪静态(网址重写)、防盗链、网址规范化等。

本文将介绍几个常用的 .htaccess 文件的应用例子。

网站伪静态化(即 URL Rewrite,网址重写)

将本来动态的网页的网址进行伪静态化改造,不仅对用户体验有帮助,更有利于提升对搜索引擎收录页面的友好程度。编辑 .htaccess 文件通过操控 Apache 环境实现伪静态,而 Apache 将用户的访问请求按照已定义的网址重写规则,获取被改写网址对应的原始页面内容,反馈给用户并输出。

.htaccess 字符串匹配规则是正则表达式,笔者所用的参考文档:正则表达式参考文档

我们来看看常见的 Discuz! 7.x 论坛程序的网址伪静态化 .htaccess 文件内容:

RewriteEngine On
RewriteBase /bbs
RewriteRule ^archiver/((fid|tid)-[\w\-]+\.html)$ archiver/index.php?$1
RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ viewthread.php?tid=$1&extra=page\%3D$3&page=$2
RewriteRule ^space-(username|uid)-(.+)\.html$ space.php?$1=$2
RewriteRule ^tag-(.+)\.html$ tag.php?name=$1

“RewriteEngine On”,开启 Rewrite 规则开关; “RewriteBase”,指后文的 RewriteRule 重写规则生效的相对路径; “RewriteRule”,定义一条重写规则。后面的字符串通过正则表达式进行匹配,匹配字符串以 ^ 开头并以 $ 结尾,替换字符串中 $1 指被第一次被匹配成功的字符串。

此处重写规则的功能:比如当访客访问 http://www.example.com/bbs/forum-21-3.html 时,网站内容将显示为 http://www.example.com/bbs/forumdisplay.php?fid=21&page=3 的内容(访问被重写网址时,网址不会被重定向/跳转)。

另外,如果在某条重写规则末尾添加 [R] 或 [R=301] 等时,访客访问被重写网址时,客户端将被执行重定向(跳转)到重写后的网址。

网址规范化

网址规范化在网友口中的概念多指如何避免“http://www.example.com/”和“http://example.com/”之间的差别所产生的负面影响。从 SEO 角度来看,“www.example.com”、“bbs.example.com”和“example.com”对于搜索引擎来说是三个独立的互不影响的网站,分开收录、分开计算权重。避免产生重复的网站内容,也是 SEO 的重要话题之一,然而如果不做好“www.example.com”和“example.com”之间差别的优化工作,将有可能产生大量的“重复内容”,影响搜索引擎的收录效果。

使用 .htaccess 配置进行网址规范化改造,不仅适用于 www 等二级域名,对多顶级域名网站也同样适用。(如不少公司网站为防止恶意注册域名,同时含有 example.com 类似的域名 example.net、example.com.cn 等)

RewriteEngine On
RewriteCond %{http_host} ^example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

“RewriteEngine On”,开启 Rewrite 规则开关; “RewriteCond”指重写的条件。后面的字符串通过正则表达式进行匹配,匹配字符串以 ^ 开头并以 $ 结尾。此处 %{http_host} 获取当前主机名称。条件为“当主机名称为 example.com”时执行下列的重写规则。其中“[NC]”指不区分大小写; “RewriteRule”,定义一条重写规则。此处含义:跳转到“http://www.example.com/”接上访问请求的网址中 example.com 后面的部分。[R=301] 指重写为 301 重定向/跳转([R] 单指跳转,意义等同 [R=302]),[L] 指最后一条匹配规则。

文件防盗链

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www.)?example.com/(.*)$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*).(jpg|jpeg|gif|png|bmp)$ /nohotlink.png [L]

“RewriteEngine On”,开启 Rewrite 规则开关; “RewriteCond”指重写的条件。此处 %{HTTP_REFERER} 指获取当前访问请求的来源网址。条件为“当请求来源网址不符合 example.com 网站网址或为空”时执行下列的重写规则。其中“[NC]”指不区分大小写; “RewriteRule”,定义一条重写规则。此处含义:当访问的文件名称以 jpg、jpeg、gif 或 png 结尾时,内容输出为 nohotlink.png 的图片内容(并非重定向/跳转)。

自定义 HTTP 错误页面

当因访客人为因素导致网站返回 HTTP 错误时,为了提升用户体验及友好程度,我们可能要自行设计相应的错误页面内容。例如当访客访问网站一个不存在的地址时,客户端将显示一个我们既定的 404 错误页面,提示用户一些有用的信息如网址建议等。(当然,HTTP 头部必须标明对应的 HTTP 错误类型,否则可能导致严重的 SEO 失误)

下面是一个定义错误页面的例子:

ErrorDocument 404 /cgi-bin/badurls.pl
ErrorDocument 500 /error.php?id=500

当网站服务器产生 HTTP 404 错误时,客户端将显示对应预先设定的页面的内容。

.htaccess 的服务器配置

根据 Apache 官方的介绍,.htaccess 文件属于分布式配置文件,可以放置在网站 www 根目录的所有子目录、以及 www 根目录的上一级目录中,生效的路径总是当前目录及其所有子目录(可在文件中自定义)。