url重写实现任意二级域名或多级域名

修改微软的URLRewrite能够对URL进行重写,这里要求对域名进行重写,实现http://1234.abc.com/http://www.abc.com/show.aspx?id=1234的重写。
  步骤:

   1、你的域名 http://www.abc.com/ 是泛解析的,并在IIS里添加了主机头为空的映射;
   2、修改微软的URLRewriter,要改两个地方 
  

1 ).BaseModuleRewriter.cs 
  
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 = "^" + 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目录下。 
   
  
3 、再就是写web.config里的重写正则了 
   
  
< RewriterRule >  
   
< LookFor > http: // (d+).abc.com</LookFor> 
    < SendTo >/ show.aspx ? id = $ 1 </ SendTo >  
   
</ RewriterRule >  
  注意: 
  问题出来了,很多人做了,实现了域名的跳转,但很多人都是转到了首页,这里不是lookfor 
/  to  / default .aspx 的问题,我自己也遇到了这样的问题,你需要在重写规则里加一个“ / ”在lookFor的结尾什么的规则改后成了: 
  
< RewriterRule >  
   
< LookFor > http: // (d+).abc.com/</LookFor> 
    < SendTo >/ show.aspx ? id = $ 1 </ SendTo >  
   
</ RewriterRule >  
  再一个问题,就是修改后的重写对参数的不友好,重写后的URL如果带有参数如http:
// www.abc.com/news.html?id=1000,重写就返回404.下面提供重写后参数中断的解决方法: 
  方法一: 
   修改重写规则,让正则表达式接受参数: 
  
< RewriterRule >  
   
< LookFor > http: // (d+).abc.com/news.html(.{0,})</LookFor> 
    < SendTo >/ show.aspx ? id = $ 1 </ SendTo >  
   
</ RewriterRule > 然后你的各种参数都可以匹配到NEWS页面,比如ID,分页等,在页面里就可以正常使用参数了。 
   
  方法二: 
   修改上面的BaseModuleRewriter.cs 
  
protected   virtual   void  BaseModuleRewriter_AuthorizeRequest( object  sender, EventArgs e) 
   

   HttpApplication app 
= (HttpApplication) sender; 
   
string path = app.Request.Url.AbsoluteUri; 
   
if(path.Contains("?")) 
   

   path 
= path.Split('?')[0]; 
   }
 
   Rewrite(path, app); }
 
  把带“?”的绝对URL拆开,只去匹配不带参数的URL。 
   
  方法三: 
   修改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 = "^" + rules[i].LookFor + "(.{0,})$"
   
   
// 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 
=   " ^ "   +  rules[i].LookFor  +   " $ " ; 改成string lookFor  =   " ^ "   +  rules[i].LookFor  +   " (.{0,})$ " ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值