UrlRewriter.dll伪静态实现二级域名泛解析

大家应该知道,微软的URLRewrite能够对URL进行重写,但是也只能对域名之后的部分进行重写,而不能对域名进行重写,

如:可将 http://http://www.115sou.com/qq/  重写为 http://www.115sou.com/show.aspx?id=qq

但不能将 http://qq.115sou.com/  重写为  http://www.115sou.com/index.aspx?id=qq。 


要实现这个功能,前提条件就是  http://www.115sou.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+)\.115sou\.com/</LookFor>
技术分享            <SendTo>/show.aspx?id=$1</SendTo>
技术分享        </RewriterRule>



好了大功告成,你在IE地址栏输入http://shouji.115sou.com/,就可以看到http://www.115sou.com/index.aspx?id=shouji

的结果了 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。