目前国内主流的网站内容管理系统中,有大部分是可以将动态的PHP、ASP、ASPX等文档直接生成HTML的。但是由于有些网站的内容较多,因此如果单纯的采取直接生成的方式,将会占用大量的服务器资源。在这种情况下,我们就可以使用“伪静态”的方式,对网站URL静态化,以达到SEO的目的。

伪静态所需要的工具

如果网站使用的是独立服务器的话,那么我们就可以随意的对网站进行伪静态操作了,假如网站使用的服务器是Apache服务器,那么它自带了mod_rewrite来实现URL的重写功能(URL Rewrite)。但是如果使用的是windows服务器的话,IIS却没有自带的伪静态工具进行URL重写,遇到这样的情况时,我们就需要使用第三方插件来解决这个问题了。

目前在IIS上使用的比较多的URL重写工具是“ISAPI Rewrite” ISAPI Rewrite组件有免费版以及商业版,免费版只支持全局httpd.ini配置,不能对每个站点进行单独设置,除非通过加载不同的dll来实现。而商业版支持用户自定义httpd.ini文件,只要放在站点根目录下就能生效。这个大大方便了用户自己修改URL重写规则。

ISAPI Rewrite是一款基于正则表达式的,由C/C++编译的URL重写组件,其使用过程和apache的mod_rewrite基本相同。目前最新版本的ISAPI Rewrite可以支持Apache的 .htaccess文件来在IIS中使用 mod_rewrite。

        ISAPI Rewrite的安装

ISAPI Rewrite有两种不同的安装方式,一种是安装包,另外一种是压缩包。如果您下载的是安装包,那么直接按照安装步骤进行安装即可。在这里重点阐述一下压缩包的安装方法。

首先,我们需要下载一个ISAPI Rewrite3的压缩包,下载地址如下:

http://www.helicontech.com/download-isapi_rewrite3.htm

在解压到任意文件夹后,我们需要手动指向其ISAPI服务。

选中ISAPI筛选器,点击“添加”按钮,找到“ISAPI_Rewrite3.dll”文件,并且选中。

这里需要注意的一点是:ISAPI Rewrite3.Dll文件所属的文件夹一定要给予IIS_WGP组的读写权限,否则网站就会报错,导致“Service Unavailable”,应用程序池遇到错误而停止。

安装成功后,我们就需要对刚才安装的组建进行测试了。测试方法如下:

首先,我们需要制作一个简单的测试网页,URL为:http://127.0.0.1/new.asp?id=1234

然后,我们可以在ISAPI Rewritewe文件夹中找到httpd.ini文件,把它的只读属性去掉,打开编辑。例如我们现在需要将new.asp?id=1234修改为new/1234.html,那么我们可以在httpd.ini文件中,加入如下代码:

RewriteRule /news/(/d+)/.html /news/.asp/?id=$1 [N,I]

保存之后,我们在浏览器输入http://127.0.0.1/new/1234.html,如果可以正常打开的话,那么我们的ISAPI Rewrite就安装成功了。如果不能正常打开,请检查文件夹权限、ISAPI的指向、优先级等内容。

1.1.3        ISAPI Rewrite的高级使用

为了减少服务器的资源,我们在很多时候会对我们网站的文件进行防盗链处理。而ISAPI Rewrite就可以做到这一点。

用ISAPI Rewrite作为防盗链工具的基本原理是:判断Referer是否来自本地主机或在信任列表中的域名,如果不是的话,就产生一个新的重写计划,并将其转向到某个放置盗链提示文件上。

下面的代码是httpd.ini的防盗链简单代码,仅供各位读者参考使用。

# ISAPI Rewrite2.0版本

RewriteCond Host: ^ (.+)$

RewriteCond Referer: ^ (?!http:////1.*).*$

RewriteCond Referer: ^ (?!http://(.*/.google/.com|*/.baidu/.com|*/.123/.com).*).*$

RewriteRule ^.*/.(?:gif|jpg|png|exe|rar|zip)$ /daolian.gif [I,O,N]

# ISAPI Rewrite3.0版本

RewriteCond %{HTTP:Host} ^ (.+)$

RewriteCond %{HTTP:Referer} ^ (?!http:////1.*).*$

RewriteCond %{HTTP:Referer} ^ (?!http://(.*/.google/.com|*/.baidu/.com|*/.123/.com).*).*$

RewriteRule ^.*/.(?:gif|jpg|png|exe|rar|zip)$ /daolian.gif [NC,N,O]

.*/.google/.com和*/.baidu/.com代表如果链接的网站是在百度或者Google搜索引擎的话,那么这样的连接是被允许的。其中的“*”代表百度或者Google下的任何二级域名。而后面的*/.123/.com是指本网站,这里各位读者可以更换成为自己的域名。当然,在这里还可以添加更多的被允许名单,为了各位读者使用方便,在本书光盘中,附带了以上这段防盗链代码,只需要添加到httpd.ini文件中即可。

本文件光盘路径:X:/正则表达式/防盗链程序代码.txt

1.1.4        正则表达式

由于ISAPI Rewrite是使用正则表达式规则的伪静态组建,因此我们需要对正则表达式有一个简单的了解。

所谓正则表达式,即为使用某种公式使得一类字符串被固定规则所替换。简单来说,ISAPI Rewrite中的正则表达式就是帮助我们将形如“news.asp?id=1234”这样的网址伪静态化为“news_1234.html”的规则。

我们用一个简单的httpd.ini文件来解释一下正则表达式的基本写法。

我们的任务是将URL:http://www.yourdomain.com/news.asp? class=seo&p=150变换成为http://www.yourdomain.com/seo/150这样的URL。

在修改httpd.ini文件之前,首先我们需要了解几个最简单的正则表达式

^[A-Za-z]+$ //匹配由26个英文字母组成的字符串

  ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串

  ^[a-z]+$ //匹配由26个英文字母的小写组成的字符串

  ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串

  ^/w+$ //匹配由数字、26个英文字母或者下划线组成的字符串

我们在这里需要替换的有两个参数,一是class=?,二是p=?,我们可以看到,class是一个栏目的名称,其元素是不固定的,而p是文章的ID,也就是说是由数字构成的。因此,我们需要在httpd.ini中加入如下规则,以达到伪静态的目的。

RewriteRule ^(.*)/seo/([0-9]+)$ textarea/news/.asp/?class=seo&p=$1 [N,I]

在这个正则表达式中,前面的(.*)是一个通配符,代表在/seo之前的所有内容不变,不需要伪静态。/seo/部分替代了/news/.asp/?class=seo&p=这一部分。“/”是转义符,([0-9]+)表示数字字符。于是就实现了伪静态的过程。

当然,如果有更多的参数,我们也可以使用简单的正则表达式来解决。例如上面的class部分如果是可变的,那么我们就在httpd.ini文件中,加上一下的这段规则。

RewriteRule ^(.*)/([a-z0-9/_]+)/([0-9]+)$ textarea/news/.asp/?class=&p=

这里使用([a-z0-9/_]+)部分来代表可变的class部分。

实际上在ISAPI Rewrite中使用最多的两个正则表达式就是代表匹配字幕和数字的([a-z0-9/_]+)以及代表数字的([0-9]+),只要灵活的掌握这两点,并且按照上面的公式去套用的话,正则表达式并不是一件难办的事。

 
*************************************************************** 

最新文章

  1. 使用Word发表博客
  2. 翻译《Writing Idiomatic Python》(四):字典、集合、元组
  3. ExtJs之Ext.form.field.TimePicker DatePicker组合框
  4. oracle数据库误删恢复方法
  5. Maya pywin32
  6. iOS中@class #import #include 简介
  7. Git和Github的应用与命令方法总结
  8. vector的内存分配与释放
  9. map,zip,reduce函数
  10. Jquery ajaxfileupload.js结合.ashx文件实现无刷新上传
  11. 解决pycharm输入法不跟随的方法
  12. Oracle启动和停止
  13. hbaes之createTable执行流程
  14. 搭建 RabbitMQ Server 高可用集群【转】
  15. TensorFlow精选Github开源项目
  16. sqlserver乱码问题解决
  17. ORACLE 导入的问题
  18. Linxu安装Tomcat与Jdk并卸载自带OpenJdk
  19. Python3基础 __setattr__ 在属性被赋值的时候,新增提示功能
  20. Docker RestApi Create mysql Container

热门文章

  1. POJ 1185 炮兵阵地(状态压缩DP)
  2. [物理学与PDEs]第4章习题参考解答
  3. Android_ _开发技巧总结
  4. C#2
  5. 在Linux环境下安装和配置phpmyadmin
  6. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
  7. photoshop CS 调整选择区域的大小
  8. 如何在组件(Component中)模拟用户控件(UserControl)中FindForm()?
  9. Mingyang.net:java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()
  10. POJ 3308 Paratroopers(最小割EK(邻接表&矩阵))