前阵子给网站写伪静态的时候修改.htaccess文件遇到了一些问题,但是网上的资料讲的又不十分明确,为了方便查找干脆自己写一篇关于.htaccess文件的使用。首先看一下.htaccess文件的作用:

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页重定向、自定义错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件夹密码保护、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户等一些功能。Unix、Linux系统或者是任何版本的Apache Web服务器都是支持.htaccess的,但是有的主机服务商可能不允许你自定义自己的.htaccess文件。

一个简单的例子

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]

  • RewriteEngine on这句话表示开启重写功能。有可能服务器设置里已经是全局下打开了,但是多写也没事。
  • RewriteCond表示条件开始。因为{HTTP_HOST}是一个Apache变量,所以需要在前面加一个“%”来指示。从“!”开始就是匹配的条件,支持正则表达式。“!”表示不等于。
  • 后面的[NC]为标记参数,表示忽略大小写(no case),常见的还有:

[L](last):终止一系列的RewriteCond和RewriteRule
[R](redirect):触发一个显示的跳转,也可以指定跳转类型,如[R=301]
[F](forbidden):禁止查看特定文件,apache会触发403错误

多个标记用逗号隔开,这些标记可以给URL地址添加特殊的标志,它们是RewriteRule命令的特殊部分。更多的标记可以参考本文末尾的附录。

上述命令的意思是:如果当前访问的网站地址不是www.example.com,就转到www.example.com对应的页面。比如www.stupid.com和 www.example.com绑定了同一个主机,当访问www.stupid.com/1.html时,会自动301转向到www.example.com/1.html。这在更换网址时是非常有用的。

另一个简单的例子

RewriteRule ^Products/P([0-9]+)\.html$ /Product.php?product_id=$1 [L]

在这个例子中,我们实现了把Product.php?product_id=123模拟成Products/P123.html(123表示数字)的伪静态。$1指代的是前面第1个用括号括起来的内容,$2指代的是前面第2个用括号括起来的内容,其他同理。

总结几个常用的正则表达式和特殊符号:

  • (.*) 用于匹配某一区域内所有内容。如 abc/def/ghi 可用 (.*)/(.*)/(.*) 匹配。
  • ([a-zA-Z]+) 匹配英文单词,允许用-和_连接。
  • ([0-9]+) 匹配多位数字,通常用于匹配ID。
  • ([0-9]) 只匹配一位的数字。
  • “^”表示正则的开始
  • “$”表示正则的结束

特别注意

Rewrite是存在优先级的,写在前面的优先级较高。对于使用Wordpress等建站程序的用户,需要把自己的规则添加在Wordpress的规则前面以防止自己的规则被wordpress的规则覆盖。(一个是优先级的问题,另外一个是wordpress在特定情况下会自动还原.htaccess文件,所以要确保自己的代码写在“# Begin WordPress”前)

更多应用

图片防盗链

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteRule .*.(jpg|gif|bmp|png)$ /images/nohotlink.jpg [L]

这是一个基于HTTP_REFERER的验证,所以只能防止一般的图片盗链,因为HTTP_REFERER的伪造比较容易。

自定义错误页面

如果用户访问了一个不存在的地址,那么就显示自定义的404错误页面。
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

网址规范化


Options +FollowSymLinks
rewriteEngine on
rewriteCond %{http_host} ^yourdomain.com [NC]
rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

这个是把所有二级域名都重定向到www.yourdomain.com的例子,是不是十分简单?需要注意的是,这里的Options +FollowSymLinks不是必须的,但在某些服务器如果不设置FollowSymLinks,可能引起500错误。

 

处理地址永久更换(301转向)

显式:
Redirect 301 /old.html http://example.com/new.html
或者
RewriteRule /old.html http://yoursite.com/new.html [R=301,L]

隐式(URL地址不变,但实际上内容是其他URL的):
RewriteRule /old.html http://yoursite.com/new.html [L]

把旧文件夹的内容链接到新文件夹:
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]

添加MIME类型

AddType video/x-flv .flv
# 如果设置类型为 application/octet-stream ,浏览器将提示下载
AddType application/octet-stream .pdf

临时错误页面


RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /error.html [R=302,L]

  • REQUEST_URI为请求的URL值。这里指所有访问maintenance.html页面的请求。
  • REMOTE_ADDR,向服务器发送请求的IP地址。此处应设为你自己的IP,这样就只有你能访问真实的页面,而其他用户只能看到error.html中“正在维护中”的提示。
  • RewriteRule指令。本例中把这些请求都重定向到了error.html 。

在Windows下启用.htaccess

进入apache/conf目录,找到httpd.conf文件,去掉
LoadModule rewrite_module modules/mod_rewrite.so
前面的“#”符号,然后设置目录属性AllowOverride All,重启apache即可。

附录: RewritreRule参数

RewriteRule参数

PS:[R]为强制重定向,[R=code] code默认为302。[F]为禁用URL,返回HTTP 403 错误

附录: RewritreCond参数

  • [NC] 不分字母大小写
  • [OR] 用于连接下一条规则

本文参考了网络上的多篇文章,特此说明。