mod_rewrite url重写的10个规则
Submitted by shf321 on 2010-12-24, 10:29 AM. Apache
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 文件。
省略 “www” 前缀
这段代码将允许访客不需要输入 “www” 前缀即可正确访问网站。
RewriteCond %{HTTP_HOST} !^owe-love\.com$ [NC] RewriteRule ^(.*)$ http://owe-love.com/$1 [R=301,L]
阻止特定的 IP 地址
如果想阻止来自特定 IP 地址访问你的网站,可以使用以下代码:
RewriteCond %{REMOTE_ADDR} ^(A\.B\.C\.D)$ RewriteRule ^/* http://www.owe-love.com/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.owe-love.com/home.html?example=12345abcd
这些地址格式都不是很漂亮,更重要的是,搜索引擎会显示一堆重复地址的网页。如果想摆脱 URL 地址中的查询字符串,请使用以下代码:
RewriteCond %{QUERY_STRING} example= RewriteRule (.*) http://www.owe-love.com/$1? [R=301]
这不仅摆脱了查询字符串,而且去除了前面的问号。
预设图片
一旦无法找到图片,使用默认的预设图片替换,以防止出现丑陋的红叉,使网站显得更加专业。代码如下:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^images/.*\.jpg$ /images/default.jpg [L]
当然,也可以改变采用其他图片格式。保证你有一个实际存在的 “default.jpg” 或其他名称的预设图片。
防止盗链
被其他网站盗取内容或图片,是网站所有者最苦恼的事情。而且图片盗链浪费了大量的服务器带宽资源。下面是一段阻止盗链的简单代码:
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?owe-love.com/ .*$ [NC] RewriteRule \.(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]
请务必改变将 “owe-love.com” 更换为你自己的域名。
重定向到维护页
如果需要维修网站并使站点下线,可以将整个网站重定向至维护页面(或其他页面),代码如下:
RedirectMatch 302 ^/ /maintenancepage.html
请将 maintenancepage.html 更换为所需网页名称。
重定向多个域名至单一域名
如果你有多个域名指向你的网站,很可能会在搜索引擎中出现重复内容。使用以下代码将多个域名重定向至单一域名:
RewriteCond %{HTTP_HOST} ^www.owe-love.com$ [NC,OR] RewriteCond %{HTTP_HOST} ^owe-love.com$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.owe-love.com$ [NC] RewriteRule ^(.*)$ http://owe-love.com/$1 [R=301,L]
谨记文件系统的优先性
服务器上的文件系统始终优先于 URL 地址重写。比如有一个名为 “services” 的文件目录,存放一个名为 “design.html” 的文件。则无法将该 URL 重定向至 “http://www.owe-love.com/services”,因为 Apache 忽略重写代码直接转向 “services” 目录。要解决此问题,只需重命名目录即可。