ISAPI_Rewrite应用技巧与方法
ISAPI Rewrite确实是个好东西,我们不仅用它可以实现简单的URL重写来实现搜索引擎友好(SEF)的URL形式,还可以利用 ISAPI Rewrite 帮您轻松实现服务器端图片负载平衡以及图片防盗链等Web功能应用。
1、IIS6.0使用ISAPI_Rewrite进行图片负载均衡
服务器环境:Windows Server 2003 + IIS 6.0 + ISAPI_Rewrite 3.x
以前网站的图片都放在一个逻辑分区里面。网站访问量的增加,磁盘负载有点压力太大。所以想使用isapi_rewrite对图片进行负载均衡。
把单数的图片拷贝到e盘的pictrue目录下。把双数的图片拷贝到f盘的pictrue目录下。
在iis中新建一个站点。建立2个虚拟目录分别指向e盘中的pic目录和f盘中的pic目录。名字分别叫pictrue0,pictrue1。
Rewirte Rule:
- # Helicon ISAPI_Rewrite configuration file
- # Version 3.1.0.58
- RewriteEngine on
- #double pictrue
- RewriteRule pictrue/([0-9]+)_([0-9]+[02468])\.(jpg|gif|png|bmp|jpeg) /pictrue0/$1_$2.$3[NC]
- #signle pictrue
- RewriteRule pictrue/([0-9]+)_([0-9]+[13579])\.(jpg|gif|png|bmp|jpeg) /pictrue1/$1_$2.$3[NC]
延伸想法:我们换可以利用图片负载平衡的原理,实现文件下载的负载平衡,如果我们结合服务器磁盘阵矩来进行负载,服务器的吞吐量会有明显的提高,有兴趣的童鞋可以试验一下。
2、利用ISAPI_Rewrite实现图片防盗链
图片被盗链对站长来说是个不幸的事情,特别被大流量网站盗链之后,给服务器带来不必要的负担,严重的甚至影响到网站的正常运行。对于商业模式的网站,损害自不必多言。
图片防盗链现在已经有一些解决办法了。基本上都是利用HTTP的 Referer头做条件判断。在Apache下利用mod_rewrite能很好防止图片和其他资源被盗链。下面是Apache下利用mod_rewrite防止Mp3资源被盗链的例子。作适当修改,同样适用于图片及其他资源的防盗链处理:
- RewriteEngineon
- RewriteCond %{HTTP_REFERER} !^http://(www.)?sky54\.net/.*$ [NC]
- RewriteRule .(mp3|rar)$ http://www\.sky54\.net/archives/001\.html [R=301,L]
以上方法对静态网页也适用。另还有在动态网页中利用脚本,进行防盗链处理。
今天主要说的是IIS下利用ISAPI_Rewrite进行图片防盗处理。ISAPI_Rewrite是helicontech开发利用正则表达式进行URl转换的软件,与Apache的mod_rewrite类似,是专用针对微软的IIS开发的,常用来做网址静态化等应用。
关于ISAPI_Rewrite的安装和使用,这里就不多说了。下面说说如何利用ISAPI_Rewrite进行图片等资源的防盗链处理。
在httpd.ini中加入以下规则:
- [ISAPI_Rewrite]
- RewriteCond Host: (.+)
- RewriteCond Referer: (?!http://1.*).*
- RewriteRule .*.(?:gif|jpg|png|jpeg|bmp) /block.gif [I,O]
原理:利用HTTP返回的 Referer 信息,如果Referer引用地址不是来自本站的,则用block.gif图片代替。block.gif上可以加上提示或警告信息,从而达到防止图片被盗链。
3、利用ISAPI_Rewrite 实现网站301永久重定向
利用ISAPI_Rewrite 实现网站301永久重定向原理
301转向(301 Redirect : Permanently Moved),表示内容永久性转移到新的URL,这样搜索引擎就会知道内容已转移,会去抓取新的URL,因此是友好的。我们会在域名解析时,创建一个空的主机名,来方便用户输入网址,而省去了www,这样虽然方便了用户,但是从SEO的角度来说,是违反了URL标准化准则的,因此,我们需要对这些不统一的URL进行301重定向。
站点域名301重定向
以下规则能够将sky54.net以301重定向方式转到www.sky54.net,这样对于搜索引擎来说是友好的。
注意:以下以本站域名301重定向的URL Rewrite Rule中包含了ISAPI_Rewrite 2.x与ISAPI_Rewrite 3.x版本2种规则,在你使用时务必确认自己服务器使用的版本,否则是无法工作的,ISAPI_Rewrite 3.x版本提供了一个ISAPI_Rewrite 2.x规则转换成ISAPI_Rewrite 3.x规则的功能。
- # For ISAPI_Rewrite 2.x
- RewriteCond Host: ^sky54\.net$
- RewriteRule (.*)http\://www\.sky54\.net$1[I,RP]
- # For ISAPI_Rewrite 3.x
- RewriteCond %{HTTP:Host} ^sky54\.net$
- RewriteRule (.*)http\://www\.sky54\.net$1[NC,R=301]
不同域名间的301永久重定向
当网站改版调整二级域名或更换新域名,旧的域名的流量与权重就白白丢掉不是很可惜?用ISAPI_Rewite此时可以帮你实现域名301永久重定向既可以将旧域名的流量与权重重定向至新域名。
比如:将sky54.cn域名利用ISAPI_Rewrite进行301永久重定向至www.sky54.net,规则同上,详细的Rewrite Rule如下:
- # For ISAPI_Rewrite 2.x
- RewriteCond Host: ^sky54\.cn$
- RewriteRule (.*)http\://www\.sky54\.net$1[I,RP]
- # For ISAPI_Rewrite 3.x
- RewriteCond %{HTTP:Host} ^sky54\.cn$
- RewriteRule (.*)http\://www\.sky54\.net$1[NC,R=301]
提示:做ISAPI_Rewrite 301重定向后,整个域名下的文件访问都将被重定向,而不仅仅是首页而已!
页面间的301永久转向
当我们改变了某些页面的地址,但是又不想损失流量,就应该使用301转向,将原来的URL重定向到新的URL上,这样搜索引擎会知道页面地址变更,而不会以为这个页面出错消失了。
规则如下:
- # For ISAPI_Rewrite 2.x
- RewriteRule ^/404\.htm$ http://www\.sky54\.net/index.php [I,O,RP,L]
- # For ISAPI_Rewrite 3.x
- RewriteRule ^/404\.html$ http://www\.sky54\.net/index\.php [NC,L,R=301,O]
我们将根目录下的404.htm使用301转向重定向到了http://www.sky54.net/index.php,当然,我们也可以自己指定任意目的地址,可以是站内的(同样以/pagename的形式)或站点外的(以http://开头的URL形式)。
注释:这里出现的O表示对URL进行标准化,可能是用来处理Unicode编码的地址(例如包含中文的URL)以及QueryString的内容,这里我没有测试过。而L表示Last Rule,最后一条规则,也就是后面的重写规则对他不起作用,防止被其他匹配的规则再次重写而造成混乱。
最后说明一下:本文所使用的RewriteRule(重写规则)仅适合ISAPI Rewrite 2.x以及3.x版本,因为标识符(比如[I,RP])在2.0以前版本是不支持的,会在httpd.parse.errors中提示错误。而如果你使用的是ISAPI Rewrite 3.0以后的版本,那么2.x的规则是不兼容的,不过3.0版本提供了一个规则转换器,我们可以直接将2.0的规则导入,它会自动转换成3.0版本的规则。