.Net中UrlRewrite实现二级或多级域名

微软的URLRewrite能够对URL进行重写,但是只能对域名之后的部分进行重写,而不能对域名进行重写,如:可将 http://www.abc.com/1234/  重写为 http://www.abc.com/show.aspx?id=1234  但不能将 
http://1234.abc.com  重写为  http://www.abc.com/show.aspx?id=1234。 

要实现这个功能,前提条件就是  www.abc.com 是泛解析的,再就是要修改一下URLRewriter了。 
总共要修改2个文件 

1.BaseModuleRewriter.cs 

protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e) 
        

            HttpApplication app 
= (HttpApplication) sender; 
            Rewrite(app.Request.Path, app); 
        }

改为 

protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e) 
        

            HttpApplication app 
= (HttpApplication) sender; 
            Rewrite(app.Request.Url.AbsoluteUri, app); 
        }


就是将  app.Request.Path 替换成了  app.Request.Url.AbsoluteUri 

2.ModuleRewriter.cs 

for(int i = 0; i < rules.Count; i++
            

                
// get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
                string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$"
 
                
// Create a regex (note that IgnoreCase is set) 
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase); 
 
                
// See if a match is found 
                if (re.IsMatch(requestedPath)) 
                

                    
// match found - do any replacement needed 
                    string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
 
                    
// log rewriting information to the Trace object 
                    app.Context.Trace.Write("ModuleRewriter""Rewriting URL to " + sendToUrl); 
 
                    
// Rewrite the URL 
                    RewriterUtils.RewriteUrl(app.Context, sendToUrl); 
                    
break;        // exit the for loop 
                }
 
            }

改为 

for(int i = 0; i < rules.Count; i++
            

                
// get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
                string lookFor = "^" + rules[i].LookFor + "$"
 
                
// Create a regex (note that IgnoreCase is set) 
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase); 
 
                
// See if a match is found 
                if (re.IsMatch(requestedPath)) 
                

                    
// match found - do any replacement needed 
                    string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
 
                    
// log rewriting information to the Trace object 
                    app.Context.Trace.Write("ModuleRewriter""Rewriting URL to " + sendToUrl); 
 
                    
// Rewrite the URL 
                    RewriterUtils.RewriteUrl(app.Context, sendToUrl); 
                    
break;        // exit the for loop 
                }
 
            }

将 

string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$"; 

改成了 

string lookFor = "^" + rules[i].LookFor + "$"; 


完成这2处改动之后重新编译项目,将生成的dll复制到bin目录下。 

再就是写web.config里的重写正则了 

<RewriterRule> 
            
<LookFor>http://(/d+)/.abc/.comLookFor>
            
<SendTo>/show.aspx?id=$1SendTo>
        
RewriterRule>


现在你在IE地址栏输入http://1234.abc.com,就可以看到http://www.abc.com/show.aspx?id=1234了 
posted @ 2009-03-31 11:26  hierce  阅读(598)  评论(0编辑  收藏  举报