Henry Liu

Make yourself the best in the world.....

ASP.NET 2.0 中的URL 重写技术

说明:当我在开发一个网站的时候,我遇到了这样一个问题:

这是一个有多个子域的网站,如:support.henryliu.com,product.henryliu.com,service.henryliu.com,客户想把这三个子站点指向同一个位置。他要实现无论何时,用户请求support.henryliu.com/default.aspx时,henryliu.com/support/default.aspx会被执行。 也就是说,他想把henryliu.com/support/default.aspx这个地址隐藏起来,不让用户看到。我们把改变原始请求URL的这个过程叫做URL重写。在这篇文章里,我将阐述关于URL重写的技术。

 

实现URL重写的几种方法?

l         利用Application_BeginRequestHttpContext类的Rewrite方法重写URL,这种方法比较简单易懂易用。

l         开发ASP.NET Http Module来达到同样的目的

l         开发ISAPI过滤器来截取请求完成重写

 

在这里,我们将就第一种方法来阐述URL重写的实现

Application_BeginRequest 事件

它是HTTP管线处理被激发的第一个事件,是重写URL的最佳地方

 

HttpContext

这个类包含有关Http的特定信息,其中有Http Request,当然也有Response对像。

这个类里面有一个Current静态属性,它里面包含当前应用程的信息。RewritePath方法是重写URL的关键。在2.0中有四个签名:

public void RewritePath(string path);

public void RewritePath(string path, bool rebaseClientPath);

public void RewritePath(string filePath, string pathInfo, string queryString);

public void RewritePath(string filePath, string pathInfo, string queryString, bool setClientFilePath);

 

按步就搬

 

1.         新建一个C# Web Application工程

2.         打开WEB配置文件,加入下列代码

<appSettings>
<add key="productsSite" value="products"></add>
<add key="servicesSite" value="services"></add>
<add key="supportSite" value="support"></add>
</appSettings>

 

我们把相对应的文件夹名称放在这里,在后面的代码中将用到。

3.         在工程里添加三个文件夹,Products,Support Services

4.         在每个文件里面添加一个default.aspx页面

5.         打开Global.asax看看事件句柄

 

protected void Application_BeginRequest(object sender, EventArgs e)

6.         把下面的代码加到上述事件里:


            string host, originalurl, newurl;
            host 
= Request.Url.Host;
            originalurl 
= Request.Url.PathAndQuery;

            
switch (host)
            
{
                
case "products.henryliu.com":
                    newurl 
= "~/" +
                    ConfigurationSettings.AppSettings[
"productsSite"]
                    
+ originalurl;
                    
break;
                
case "services.henryliu.com":
                    newurl 
= "~/" +
                    ConfigurationSettings.AppSettings[
"servicesSite"]
                    
+ originalurl;
                    
break;
                
case "support.henryliu.com":
                    newurl 
= "~/" +
                    ConfigurationSettings.AppSettings[
"supportSite"]
                    
+ originalurl;
                    
break;
                
default:
                    newurl 
= "~/" +
                    ConfigurationSettings.AppSettings[
"supportSite"]
                    
+ originalurl;
                    
break;
            }

            HttpContext.Current.RewritePath(newurl);


 

  让我们再来看看这段代码:

 

首先我们用 Request.Url.Host 属性得到主机名,如:support.henryliu.com,其次还要获得当前路径的查询字符串。Switch语句我们用来根据当前用户的请求来判断真正要执行的页面请求。最后,我们调用RewritePath()方法重写当前请求的URL

 

总节:在这篇文章里我们可以学习到怎样用Application_BeginRequest HttpContext.RewritePah()来重写URL。这是一个快速实现实际请求页面和我们看到的URL不同的方法。

p.s.这是一篇译自Dotnetbips 网站的一篇技术文章,拿来共同分享.感谢作者Bipin Joshi   原文地址

posted on 2006-10-16 16:18 Henry Liu 阅读(5614) 评论(7)  编辑 收藏 网摘 所属分类: C#

评论

#1楼 2006-10-19 15:47 MK2      

Application_BeginRequest 先处理还是Module先处理呢?能用正则表达式吧?   回复  引用  查看    

#2楼[楼主] 2006-10-20 09:43 Henry.Liu      

不太明白你的问题,但是Application_BeginRequest是在整个应用程序被请求的时候,就会执行的过程,至于MODULE我还不太清楚,你的意思?

如查用正则表达式来判断当前被请求的URL,当然是可以的。
  回复  引用  查看    

#3楼 2007-02-01 14:22 Apple[未注册用户]

在每个文件里面添加一个default.aspx页面!!!   回复  引用    

#4楼[楼主] 2007-02-01 23:14 Henry.Liu      

@Apple
谢谢你提出这个不合理的地方!

准确点儿说,应该是在每个你想重写的相应文件夹中,必须要有一个default.aspx页面,当然这个页面名字可以不叫default.aspx,这要看你在你的IIS中怎么样设置了。

谢谢关注!互相学习!
  回复  引用  查看    

#5楼 2007-10-25 19:44 大侠123321[未注册用户]

楼主.我现在在本地测试你的这个方法,但是不能成功!
当我在地址栏里输入类似于support.henryliu.com这个后它会找不到什么东西.能否指点一二.我的QQ:43030828
  回复  引用    

#6楼 2008-12-29 12:17 ikiki[未注册用户]

手工编写象上面这样的编码的坏处是,很枯燥乏味,而且容易犯错。我建议你别自己写,而是使用网上现成的HttpModule来完成这项工作。   回复  引用    

#7楼 2009-04-22 22:35 liyundong      

学习一下,先去试试!谢谢了!   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 530426




相关文章:

相关链接: