注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

高级菜鸟

积累并顺便分享AI,启动技术,C#,ASP.net等知识的地方

 
 
 

日志

 
 

Asp.net正则表达式实现URL重写  

2011-04-08 12:09:12|  分类: ASP.NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

使用HTTP模块重写URL

在ASP.NET程序中,处理每一个HTTP请求时都会执行已经注册的HTTP模块,所以在HTTP模块中可以编写适用于所有请求的公用代码。对于重写URL来说,在得到一个请求以后,要分析这个被请求的URL,如果需要重写,则按照重写规则跳转到重写后的页面。这个任务适合在HTTP模块中实现。下面通过一个例子说明具体如何实现。

【例1】 简单的URL重写。

在第4章所开发的网上书店项目中,有许多动态URL,一个典型的例子是图书详情页面。当用户在图书列表中单击一本图书时,就会转到图书详情页面,并将所选择的图书编号作为检索字符串传递给图书详情页面,形成类似于BookDetail.aspx?id=10的动态URL。为了将动态URL优化成静态URL,希望使用BookDetail/10的URL访问刚才的页面,这就需要URL重写。当网上书店程序收到一个静态URL请求时,将其重写为动态URL。

(1)打开第4章所创建的网上书店项目BookShop。

(2)在项目中添加一个HTTP模块,命名为MyUrlRewriter。在HttpApplication的BeginRequest事件中,检查所请求的URL并在必要时进行重写。代码如下:

  1. public class MyUrlRewriter : IHttpModule  
  2. {  
  3.     public void Dispose()  
  4.     {   }  
  5.     public void Init(HttpApplication context)  
  6.     {  
  7.         context.BeginRequest += new EventHandler
    (context_BeginRequest);  
  8.     }  
  9.     void context_BeginRequest(object sender, EventArgs e)  
  10.     {  
  11.         HttpContext context = HttpContext.Current;  
  12.         string path = context.Request.Path.ToLower();
    //得到请求路径  
  13.         if (path.StartsWith("/bookdetail/"))  
  14.         {  
  15.             //静态URL形式为/bookdetail/6,其中6
    为图书编号,重定向动态URL  
  16.             string id = path.Substring(path.LastIndexOf('/') + 1);  
  17.             context.RewritePath("~/BookDetail.
    aspx?
    id=" + id, false);  
  18.         }  
  19.     }  

(3)打开图书列表控件BookListControl.ascx,其中的链接地址原为动态URL,如下代码:

  1. <a href="BookDetail.aspx?id=<%#Eval("BookID")%>"> 
  2. <img src="BookImages/<%#Eval("SmallImage") %>"
     alt="<%#Eval("BookTitle") %>" style ="width: 100px;" /> 
  3. </a> 

将上述代码中的动态URL改为静态URL,代码如下:

  1. <a href="BookDetail/<%#Eval("BookID")%>"> 
  2. <img src="BookImages/<%#Eval("SmallImage") %>"
     alt="<%#Eval("BookTitle") %>" style ="width: 100px;" /> 
  3. </a> 

(4)运行网上书店项目,从图书列表中选择一个图书查看详情,可以看到图书详情页面的URL已经变成了静态URL。运行界面如图1所示。

 
(点击查看大图)图1  图书详情URL重写示例1
(5)从图1中可以看到,页面上所有图片(包括顶部横幅、图书封面等)都不能显示了。这是由于在页面代码中使用相对路径引用图片,当URL重写后路径就发生了变化。例如,图书封面的相对路径为BookImages/1b.jpg,在未进行URL重写以前,这个图片的绝对路径为/BookImages/1b.jpg,而进行了URL重写后,图片绝对路径变为/BookDetail/BookImages/1b.jpg。为了解决这个问题,所有图片应该使用绝对路径而非相对路径。在母版中修改LOGO和横幅图片路径,如下代码所示(注意图片路径是以/开头,表示绝对路径,如果没有这个/,则为相对路径)。
  1. <img src="/images/logo.jpeg" alt="攀登者网上书店" 
    style="height:80px;" /> 
  2. <img alt="大学优惠" src="/images/banner.jpg" 
    style="height:80px;" /> 

同样的道理,在BookDetail.aspx页面中需要修改图书封面为绝对路径。

  1. cover.ImageUrl = "/BookImages/" + book.bigImage; 

(6)如果页面上的JavaScript和CSS使用相对路径引用,则也存在与图片相同的问题,将所有JavaScript和CSS文件引用都修改为绝对路径。

(7)再次运行项目,并查看某图书详情,可以看到所有图片都能正常显示,所有CSS样式也正常应用,如图2所示。

 
(点击查看大图)图2  图书详情URL重写示例2



Asp.net正则表达式实现URL重写

使用正则表达式强大的匹配替换功能,可以实现更加灵活通用的URL重写。其基本原理也是使用HTTP模块捕获所有访问请求,将请求的URL(通常是静态URL)按照一定的模式进行替换,得到一个新的URL(通常是动态URL),然后访问这个重写后的URL。

根据以上理论,如果要自己编码实现利用正则表达式重写URL,需要在例1的基础上,在HTTP模块中定义重写URL所使用的正则表达式,并使用这些正则表达式对静态URL进行替换即可。目前网络上也有几个开源的URL重写工具,如UrlRewriter.NET(网址http://urlrewriter.net/)、UrlRewritingNet(网址http://www.urlrewriting.net/149/en/home.html)等,都支持正则表达式。这两个URL重写工具都使用配置文件定义重写的正则表达式。下面以UrlRewriter.Net为例说明如何实现URL重写。

【例2】 UrlRewriter.Net实现URL重写。

假设有一个面向全球各个国家的销售网站,使用多种语言向客户展示商品信息。网站根目录下有一个Detail.aspx页面,用来显示商品信息。访问此页面时需要指定两个参数:商品编号和界面语言。动态URL使用检索字符串传递参数,具有类似这种形式:Detail.aspx?language=en&id=10,其中en表示语言为英语,10表示要查看的商品编号为10。为了实现URL优化,希望用户使用静态URL访问这个页面,静态URL具有以下形式:/en/Detail10.aspx。本例演示如何使用UrlRewriter.NET实现这个功能。

(1)在ASP.NET项目中添加对Intelligencia.UrlRewriter程序集的引用。

(2)在web.config文件的configSection节中添加以下代码,这些代码的作用是告诉UrlRewriter.NET从web.config文件的rewriter结点中读取配置信息。

  1. <configSections> 
  2.     <section name="rewriter"  requirePermission="false" 
  3. type="Intelligencia.UrlRewriter.Configuration. RewriterConfiguratio-  
  4. nSectionHandler, Intelligencia.UrlRewriter" /> 
  5.   </configSections> 

(3)在web.config文件中注册UrlRewriter.NET所使用的HTTP模块。

  1. <httpModules> 
  2. <add  name="UrlRewriter" 
  3.  type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.  
  4. UrlRewriter"/> 
  5. </httpModules> 

(4)在web.config文件中用添加用正则表达式描述的URL重写规则。

  1. <rewriter> 
  2. <rewrite url="~/(.*)/Detail(.*).aspx" to="
    ~/Detail.aspx? 
    language=$1&amp;  
  3. id=$2" /> 
  4. </rewriter> 

(5)为了测试URL重写效果,在项目中添加一个页面Detail.aspx。出于演示目的,本页并不根据参数显示不同的语言界面和产品信息,而只是在页面上显示从QueryString获得的语言和产品编号参数。

  1. <form id="form1" runat="server"> 
  2. <div> 
  3. 你所使用的语言为:<asp:Label Text="" runat="server"
     ID="language"/> <br /> 
  4. 你所要查看的产品为:<asp:Label Text="" runat="server" 
    ID="product" /><br /> 
  5. </div> 
  6. </form> 

(6)在Detail.aspx.cs文件中,在Page_Load事件中显示当前的语言和产品编号。

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     if (!IsPostBack)  
  4.     {  
  5.         product.Text = Request.QueryString["id"];  
  6.         language.Text = Request.QueryString["language"];  
  7.     }  

(7)在网站中添加一个HTML页面,页面中放置几个超链接,以打开产品详情页面。

  1. <body> 
  2. <a href="en/detail01.aspx">en,产品01</a><br /> 
  3. <a href="zh/detailp10.aspx">中文,产品p10</a><br /> 
  4. </body> 

(8)运行网站,运行结果如图6.5所示。

 
(点击查看大图)图3 URL重写效果


  评论这张
 
阅读(4159)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018