有些用户可能还不知道.htaccess 文件是什么,所以我们首先来说明一下 htaccess 的作用。在 WordPress 的
根目录下,你会看到一个名为.htaccess 的文件,它可以是由系统创建、也可以是用户自己编辑而成的。它是 Apache 服务器中的一个配置文件,它负
责相关目录下的网页配置,对 WordPress 中实现永久链接 (Permalink) 至关重要。同时利用它,我们也可以实现:网页 301 重定向、自定义

404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。下面我们就来看看如何配制 htaccess 。

以下是 WordPress 中默认的 htaccess 内容。我们一一来看一下每一行的作用。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

第一行用来判断 Apache 中是否安装了 rewrite 模块。如果存在 rewrite 模块,「RewriteEngine On」 则用来开启 rewrite 模块。

「RewriteBase /」
用来表示 Apache 要对 URL 重写的部分。比方站点为 http://domain.com/。 RewriteBase 后面为 「/」 时,表示对主域名下面
的所有子路径进行重写,如果是 「/blog/」 是只会对 http://domain.com/blog/后面的部分进行重写。

RewriteCond 表示重写 URL 应满足的一些条件,RewriteRule
后面的第一个参数表示要重写的 URL 满足的规则 (正则表达式),第二个参数表示重写后的 URL 。最后的那个 [L] 表示表明当前规则是最后一条规则,停止分
析以后规则的重写。 (方框内还可以支持很多其它参数,我们会在下面介绍)

所以 「RewriteRule ^index.php$ – [L]」 表示若当前请求的 URL 恰好为 index.php,则不要进行后面的判断了。

「RewriteCond %{REQUEST_FILENAME} !-f」 和 「RewriteCond
%{REQUEST_FILENAME}
!-d」 表示当前的 URL 并不是一个文件 (-f) 或目录 (-d) 。当这两个条件同时满足时,最后一条 「RewriteRule . /index.php
[L]」 会把所有请求都重写为 index.php 。

从这里我们可以看出,WordPress 默认把所有不指到静态文件或目录的 url 全部重写到了 index.php,然后由 index.php 统一处理请求。

刚才我们提到了 [L] 的作用,其实 RewriteRule 还支持很多其它参数,包括:

  • R 强制外部重定向,后面可以代 301 或 302 跳转。
  • F 禁用 URL, 返回 403HTTP 状态码。
  • G 强制 URL 为 GONE,返回 410HTTP 状态码。
  • P 强制使用代理转发。
  • L 表明当前规则是最后一条规则,停止分析以后规则的重写。
  • N 重新从第一条规则开始运行重写过程。
  • C 与下一条规则关联。
  • T=MIME-type(force MIME type) 强制 MIME 类型。
  • NS 只用于不是内部子请求。
  • NC 不区分大小写。
  • QSA 追加请求字符串。
  • NE 不在输出转义特殊字符。

htaccess 在 WordPress 中的一些使用技巧

上面讲了一下 WordPress 中.httaccess 的基本用途,其实利用 htaccess 文件还可以帮助我们完成很多其它的工作。下面我来介绍其中一些常用的功能,更多的读者可以自己去尝试。

域名跳转

有些时候,我们会想把 weixiaoduo.com 的域名全部跳转到 www.weixiaoduo.com 下。这个时候 htaccess 就可以派上用场了。在.htaccess 文件中添加类似下面的代码:(下面这段代码在网站更换域名时,也同样使用)

RewriteCond %{HTTP_HOST} ^weixiaoduo.com [NC]
RewriteRule ^(.*)$ https://www.weixiaoduo.com/$1 [L,R=301]

类似的还可以用 htacess 也可以用来更换 URL 的目录结构,这个在 Category 名字被更换时特别有用:

RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]

注:R 后面的 301 表示此跳转为永久跳转,也可以根据实际情况该成临时跳转 (302) 。

防盗链

图片的盗链可能是很多站长最为头痛的事情,自己的图片被人白白拿去不说,还会免费占用了自己网站的资源,使用 htaccess 文件同样可以实现防盗链的功能。代码如下:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://weixiaoduo.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://weixiaoduo.com$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.weixiaoduo.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.weixiaoduo.com$ [NC]
RewriteRule .*.(gif|jpg|jpeg|png|bmp|swf|mp3|wav|zip|rar)$ https://www.weixiaoduo.com/404.html [R,NC]

这段代码会判断请求的 referer,如果链接不是从本站点击过来的,默认都会跳转到一个 404 页面。在 RewriteRule 中指定了要防盗链的文件类型。

防止垃圾评论

例用 htaccess 同样可以防止一部分来源不明的垃圾评论:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post.php*
RewriteCond %{HTTP_REFERER} !.*domain.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://domain.com/$ [R=301,L]

这段代码,判断一个 POST 请求是否是由浏览器发出的 (判断 HTTP_USER_AGENT 是否为空),并且 Refer 是否本站的,只要其中任意一个条件不满足,就将请求自动跳转到首页。

注意,这段代码只适用于 WordPress,其实的框架可以根据其具体情况把 wp-comments-post 修改成对应的 URL 。

只允许自己访问 WordPress 的后台

如果你有一个固定的 IP,那么你完全可以在 htaccess 中设定只有自己能访问 WordPress 的后台。在 wp-admin 目录下建立一个新的.htaccess 文件,里面写入如下代码:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all

# xx.xx.xx.xx 为您的 IP,您也以设定多个 IP 。
allow from xx.xx.xx.xx
allow from xx.xx.xx.xxx
</LIMIT>

注:对于这段代码,一定是在 wp-admin 文件夹下建立新的 htaccess,很多坑爹的文章都没有告诉你这一点,直接添加到网站根目录下的那个 htacess 下的话……您要是想要自己的整个网站都只能自己访问的话,不妨试试。

阻止某些 IP 访问自己的网站

如果有些垃圾网站的 Robot 总是不停的抓取你网站的数据,你可以在 htaccess 中屏蔽掉这些 IP 。

<Limit GET POST>
order allow,deny
deny from xx.xx.xx.xx
allow from all
</Limit>

类似的,更换一下 deny 和 allow,可以实现只允许某些特定 IP 访问自己的网站,当然如果您真的想要这么做的话。

判断浏览器

浏览器兼容可以说是前端工程师最为心痛的事。与其在 css 中写各种 hack,不如在 htacess 中判断浏览器,直接指向不同的 css 文件。

RewriteCond %{REQUEST_URI} index.css*
RewriteCond %{HTTP_USER_AGENT} "^Mozilla/4.0$"
RewriteRule ^(.*)$ http://weixiaoduo.com/firefox.css

类似的,利用 htacess 判断访问者是否持有的是移动设备也很容易。

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} "Windows CE" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "NetFront" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Palm OS" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Blazer" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Elaine" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "^WAP.*$" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Plucker" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "vodafone" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "iPhone" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "nokia" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "symbian" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Opera Mini" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "BlackBerry" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "j2me" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "midp" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "htc" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "java" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "sony" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "android" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "AvantGo" [NC]
RewriteRule (.*) http://mobi.weixiaoduo.com/ [R,L]

因为有点多,为了方便阅读,还有通用的浏览器的 USER_AGENT 放在了文章的最后。有兴趣的读者去可以去看看吧。

禁止访问特定的文件类型或文件

有些特定的文件、或某些文件,我们可能不想让用户访问到,可以用如下代码:

<Files secretfile.jpg>
 order allow,deny 
 deny from all 
</Files>

<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
 Order Allow,Deny 
 Deny from all 
</FilesMatch>

判断浏览器的语言

想要根据浏览器的语言设定,跳转到不同的页面,可以用如下代码:

RewriteCond %{HTTP:Accept-Language} ^zh-cn.*$ [NC]
RewriteRule ^/?$  index_cn.htm [R=301,L]

总结

就说到这里了,其实 htaccess 的用途还有很多很多,读者可以根据上面的例子自己去挖掘 htaccess 的新的用途。不过注意修改 htaccess 时一定要小心,因为一但写错,很可能导致整个网站都无法访问。