http://www.mangguo.org/10-mod_rewrite-rule-you-should-know/
Mod_rewrite 是一个基于 Apache 服务器的动态 URL 重写引擎。Apache 服务器已本地集成了该模块,但默认情况下不启用。
它能够超越简单的重写功能,以下其中的一些实用技巧。
开启 Mod_Rewrite 模块
Mod_rewrite 模块通过 .htaccess 文件使用。粘贴以下代码至 .htaccess 文件头部,以开启 mod_rewrite 模块:
RewriteEngine on
谨记,.htaccess 文件命令是区分大小写的。要使用 mod_rewrite 模块,此代码必须在 .htaccess 文件的开头输入。
基本 Mod_Rewrite 布局
mod_rewrite 命令的基本格式为:
RewriteRule Pattern Substitution [Flag(s)]
URL 地址是相对的
您所要重定向的 URL 地址是相对于当前 .htaccess 所在目录而言的。因此如果 .htaccess 存放于根目录,URL 地址均涉及并相对于根目录;如果 .htaccess 存放于子目录,URL 地址涉及并相对于特定的子目录。
基本重定向
如果只是想创建简单的从一个 URL 地址到另一个 URL 地址的 301 重定向,可以使用以下代码:
RewriteRule ^fileone.html$ filetwo.html
这是一个非常基本的规则,意味着任何来自 fileone.html 的请求将被引导至 filetwo.html 文件。
关于 301 重定向请详细参考:使用 .htaccess 实现 301 域名重定向
省略 "www" 前缀
这段代码将允许访客不需要输入 "www" 前缀即可正确访问网站。
RewriteCond %{HTTP_HOST} !^mangguo\.org$ [NC]
RewriteRule ^(.*)$ http://mangguo.org/$1 [R=301,L]
阻止特定的 IP 地址
如果想阻止来自特定 IP 地址访问你的网站,可以使用以下代码:
RewriteCond %{REMOTE_ADDR} ^(A\.B\.C\.D)$
RewriteRule ^/* http://www.mangguo.org/sorry.html [L]
阻止特定的 User Agent
如果想阻止一组来自相同 User Agent 的 IP 地址段,可使用以下代码:
RewriteCond %{HTTP_USER_AGENT} UserAgent
RewriteRule .* - [F,L]
通过修改 User Agent 参数内容,可以轻易阻止任何 User Agent 的访问。如果要同时阻止一个以上,则代码如下:
RewriteCond %{HTTP_USER_AGENT} UserAgentA [OR]
RewriteCond %{HTTP_USER_AGENT} UserAgentB
你可以根据需要添加更多 User Agent 字段,确保每一行换行处使用 [OR] 来标示。
去除查询字符串
比方说,网站上除首页以外的其他网页 URL 地址格式如下,以查询字符串区分:
http://www.mangguo.org/home.html?example=12345abcd
这些地址格式都不是很漂亮,更重要的是,搜索引擎会显示一堆重复地址的网页。如果想摆脱 URL 地址中的查询字符串,请使用以下代码:
RewriteCond %{QUERY_STRING} example=
RewriteRule (.*) http://www.mangguo.org/$1? [R=301]
这不仅摆脱了查询字符串,而且去除了前面的问号。
预设图片
一旦无法找到图片,使用默认的预设图片替换,以防止出现丑陋的红叉,使网站显得更加专业。代码如下:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^images/.*\.jpg$ /images/default.jpg [L]
当然,也可以改变采用其他图片格式。保证你有一个实际存在的 "default.jpg" 或其他名称的预设图片。
防止盗链
被其他网站盗取内容或图片,是网站所有者最苦恼的事情。而且图片盗链浪费了大量的服务器带宽资源。下面是一段阻止盗链的简单代码:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mangguo.org/ .*$ [NC]
RewriteRule \.(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]
请务必改变将 "mangguo.org" 更换为你自己的域名。
重定向到维护页
如果需要维修网站并使站点下线,可以将整个网站重定向至维护页面(或其他页面),代码如下:
RedirectMatch 302 ^/ /maintenancepage.html
请将 maintenancepage.html 更换为所需网页名称。
重定向多个域名至单一域名
如果你有多个域名指向你的网站,很可能会在搜索引擎中出现重复内容。使用以下代码将多个域名重定向至单一域名:
RewriteCond %{HTTP_HOST} ^www.mangguo.org$ [NC,OR]
RewriteCond %{HTTP_HOST} ^mangguo.org$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.mangguo.org$ [NC]
RewriteRule ^(.*)$ http://mangguo.org/$1 [R=301,L]
谨记文件系统的优先性
服务器上的文件系统始终优先于 URL 地址重写。比如有一个名为 "services" 的文件目录,存放一个名为 "design.html" 的文件。则无法将该 URL 重定向至 "http://www.mangguo.org/services",因为 Apache 忽略重写代码直接转向 "services" 目录。要解决此问题,只需重命名目录即可。
英文原稿:10+ Mod_Rewrite Rules You Should Know | Noupe
翻译整理:10 个你应该知道的 mod_rewrite 规则 | 芒果