动态页面转成伪静态页面URL REWRITE(摘)

一、URL Rewrite概述

1、把URI地址用作参数传递:URL REWRITE

 

最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换:

这样几乎可以不修改程序的实现将 news.asp?id=234 这样的链接映射成 news/234.html,从外面看上去和静态链接一样。

 

Apache服务器上有一个模块(非缺省):mod_rewriteURL REWRITE功能之强大足够写上一本书。

当我需要将将news.asp?id=234的映射成news/234.html时,只需设置:

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

这样就把 /news/234.html 这样的请求映射成了 /news.asp?id=234

当有对/news/234.html的请求时:web服务器会把实际请求转发给/news.asp?id=234

 

而在IIS也有相应的REWRITE模块:比如ISAPI REWRITEIIS REWRITE,语法都是基于正则表达式,因此配置几乎和apachemod_rewrite是相同的:

比对于某一个简单应用可以是:

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

这样就把

http://www.chedong.com/news/234.html

映射到了

http://www.chedong.com/news/news.php?id=234

 

一个更通用的能够将所有的动态页面进行参数映射的表达式是:

http://www.myhost.com/foo.php?a=A&b=B&c=C

表现成 http://www.myhost.com/foo.php/a/A/b/B/c/C

RewriteRule (.*?/.php)(/?[^/]*)?/([^/]*)/([^/]*)(.+?)?$1(?2$2&:/?)$3=$4?5$5: [N,I]

以下是针对phpBB的一个Apache mod_rewrite配置样例:

   RewriteEngine On

   RewriteRule /forum/topic_(.+)/.html$ /forum/viewtopic.php?t=$1 [L]

   RewriteRule /forum/forum_(.+)/.html$ /forum/viewforum.php?f=$1 [L]

   RewriteRule /forum/user_(.+)/.html$/forum/profile.php?mode=viewprofile&u=$1     [L]

这样设置后就可以通过topic_1234.html forum_2.html user_34.html这样的链接访问原来的动态页面了。

 

通过URL REWRITE还有一些好处:

mod_rewriteisapirewrite基本兼容,但是还是有些不同,比如:isapirewrite"?"需要转义成"/?"mod_rewrite不用,isapirewrite支持 "/d+" (全部数字),mod_rewrite不支持。

隐藏后台实现:这在后台应用平台的迁移时非常有用:当从asp迁移到java平台时,对于前台用户来说,根本感受不到后台应用的变化;

简化数据校验:因为像(/d+)这样的参数,可以有效的控制数字的格式甚至位数;

比如我们需要将应用从news.asp?id=234迁移成news.php?query=234时,前台的表现可以一直保持为 news/234.html。从实现应用和前台表现的分离:保持了URL的稳定性,而使用mod_rewrite甚至可以把请求转发到其他后台服务器上。

 

2、基于PATH_INFOURL美化

Url美化的另外一个方式就是基于PATH_INFO

PATH_INFO是一个CGI 1.1的标准,经常发现很多跟在CGI后面的"/value_1/value_2"就是PATH_INFO参数:

比如:http://phpunixman.sourceforge.net/index.php/man/ls 中:$PATH_INFO = "/man/ls"

PATH_INFOCGI标准,因此PHP Servlet等都有的支持。比如Servlet中就有request.getPathInfo()方法。

注意:/myapp/servlet/Hello/foo getPathInfo()返回的是/foo,而/myapp/dir/hello.jsp/foogetPathInfo()将返回的 /hello.jsp,从这里你也可以知道jsp其实就是一个ServletPATH_INFO参数。ASP不支持PATH_INFO

PHP中基于PATH_INFO的参数解析的例子如下:

//注意:参数按"/"分割,第一个参数是空的:从/param1/param2中解析出$param1 $param22个参数

if ( isset($_SERVER["PATH_INFO"]) ) {

       list($nothing, $param1, $param2) = explode('/', $_SERVER["PATH_INFO"]);

}

 

如何隐蔽应用:例如 .php,的扩展名:

APACHE中这样配置:

<FilesMatch "^app_name$">

       ForceType application/x-httpd-php

</FilesMatch>

 

如何更像静态页面:app_name/my/app.html

解析的PATH_INFO参数的时候,把最后一个参数的最后5个字符“.html”截断即可。

注意:APACHE2中缺省是不允许PATH_INFO的,需要设置 AcceptPathInfo on

 

特别是针对使用虚拟主机用户,无权安装和配置mod_rewrite的时候,PATH_INFO往往就成了唯一的选择。

 

OK,这样以后看见类似于http://www.example.com/article/234这样的网页你就知道可能是 article/show.php?id=234这个php程序生成的动态网页,很多站点表面看上去可能有很多静态目录,其实很有可能都是使用12个程序实现的内容发布。比如很多WIKIWIKI系统都使用了这个机制:整个系统就一个简单的wiki程序,而看上去的目录其实都是这个应用拿后面的地址作为参数的查询结果。

 

利用基于MOD_REWRITE/PATH_INFO CACHE服务器的解决方案对原有的动态发布系统进行改造,也可以大大降低旧有系统升级到新的内容管理系统的成本。并且方便了搜索引擎收录入索引。

二、代码实现URL Rewrite

在网上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法。其实这种方法是错误的。

第一,   HttpHandle是实现不了urlrewrite;

第二,   第二Server.Transfer是标准的重定向,根本不是 urlrewrite

其实,实现urlrewrite不用自己HttpHandle,也不用自己实现HttpModule,用几行代码就可以轻松实现。

我这里介绍的是在虚拟主机上,虚拟主机不同于自己的服务器,你是没有权限去修改IIS,也没有权限去安装iis rewrite之类的IIS插件。

但是我们仍然可以轻松完成需要的功能。

具体做法如下:打开global.asax.cs,定位到protected void Application_BeginRequest(Object sender, EventArgs e)。从方法名我想也能猜到它是做什么的。

 

输入如下代码:

 

protected void Application_BeginRequest(Object sender, EventArgs e)

{

   string oldUrl = HttpContext.Current.Request.RawUrl ;

 

   string pattern = @"^(.+)default/(/d+)/.aspx(/?.*)*$";

   string replace = "$1default.aspx?id=$2";

 

   if(Regex.IsMatch(oldUrl, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))

   {

        string newUrl = Regex.Replace(oldUrl, pattern, replace, RegexOptions.Compiled |

RegexOptions.IgnoreCase);

        this.Context.RewritePath(newUrl);

   }

}

 

有了上边这段代码,我访问一个类似:.../default/123.aspx 的网址,当然这个网址在我的电脑上不存在,它就会被定向到:.../default.aspx?id=123

 

当然,利用功能强大的正则表达式,你可以任意按照自己的需要来重写url,这一切都是在服务器端默默的进行,在客户端是不会有任何察觉的。由于是在虚拟主机上,我们只能重定向.aspx文件,如果是自己的服务器,只要把后缀名在IIS中注册一下,就可以实现任意后缀名的处理。比如你可以注册一个*.myweb这样的类型,这样别人访问default/456.myweb时,你可以把它重定向到default.aspx?id=456。总之一句话,只要你能想到.net就可以帮你实现,并且这一切不需要多少的代码。

 

 

三、ISAPI Rewrite插件实现

最近在用phpSymfony开发项目,看到Symfony中有一个部分叫"Links And The Routing System",就是把系统内的所有动态的文件和参数的URL形式变成静态样式(这样的好处是可以被搜索引擎收录,也就是所谓的"搜索引擎优化"),后来 网上找了一下,IIS可以实现动态形式URL转换成静态形式URL,当然,也就是说支持IIS本来所支持的所有语言,包括ASP,ASP.NET等等。

1、下载isapi_rewriteisapi_rewrite分精简(lite)和完全(full) 版。精简版不支持对每个虚拟主机站点进行重写,只能进行全局处理。不过对于有服务器的朋友,精简版也就够啦。精简版下载地址:http://www.helicontech.com /download/,就是那lite version (free)啦。

2、安装.msi的文件,和装一般程序一样装就可以了,俺就装在e:/isapi_rewrite3

3、接下来一步比较重要哦,看仔细喽。打开internet 信息服务,右键,web站点属性,点isapi筛选器选项卡.添加筛选器,名称自己填,路径自己指定isapi_rewrite.dll,然后确定。

 

 


4、来测试一下。新建一个1ting.asp,里面写上<%=request.querystring("inso")%>,效果就是执行的时候1ting.asp?inso=*浏览器显示* 

 


5、这一步很重要哦,开始添加rewrite规则.正则表达式。

找到isapi_rewrite目录,把httpd.conf的只读属性去掉,打开编辑。

我们要把1ting.asp?inso=im286映射成为 1ting-im286.html这样的类型,需要在httpd.ini里加上这么一行:rewriterule /1ting-([0-9a-z]*).html /1ting.asp/?inso=$1,保存。

 

 

6、来来来,到浏览器里查看一下效果吧。输入http://127.0.0.1/1ting.asp?inso=im286http://127.0.0.1/1ting-im286.html,显示的内容是不是都是im286?这就证明成功啦! 

 

  

嘿嘿,1ting-im286.html这样的页面要比1ting.asp?inso=im286容易收入,所以现在还在用动态方式的朋友可以尝试一下这样的静态映射效果. iis rewrite也可以实现这样的功能。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值