ASP.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

None.gif protected   virtual   void  BaseModuleRewriter_AuthorizeRequest( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            HttpApplication app 
= (HttpApplication) sender;
InBlock.gif            Rewrite(app.Request.Path, app);
ExpandedBlockEnd.gif        }

改为

None.gif protected   virtual   void  BaseModuleRewriter_AuthorizeRequest( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            HttpApplication app 
= (HttpApplication) sender;
InBlock.gif            Rewrite(app.Request.Url.AbsoluteUri, app);
ExpandedBlockEnd.gif        }


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

2.ModuleRewriter.cs

None.gif for ( int  i  =   0 ; i  <  rules.Count; i ++ )
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                
// get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
InBlock.gif
                string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";
InBlock.gif
InBlock.gif                
// Create a regex (note that IgnoreCase is setdot.gif)
InBlock.gif
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
InBlock.gif
InBlock.gif                
// See if a match is found
InBlock.gif
                if (re.IsMatch(requestedPath))
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
// match found - do any replacement needed
InBlock.gif
                    string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
InBlock.gif
InBlock.gif                    
// log rewriting information to the Trace object
InBlock.gif
                    app.Context.Trace.Write("ModuleRewriter""Rewriting URL to " + sendToUrl);
InBlock.gif
InBlock.gif                    
// Rewrite the URL
InBlock.gif
                    RewriterUtils.RewriteUrl(app.Context, sendToUrl);
InBlock.gif                    
break;        // exit the for loop
ExpandedSubBlockEnd.gif
                }

ExpandedBlockEnd.gif            }

改为

None.gif for ( int  i  =   0 ; i  <  rules.Count; i ++ )
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                
// get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
InBlock.gif
                string lookFor = "^" + rules[i].LookFor + "$";
InBlock.gif
InBlock.gif                
// Create a regex (note that IgnoreCase is setdot.gif)
InBlock.gif
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
InBlock.gif
InBlock.gif                
// See if a match is found
InBlock.gif
                if (re.IsMatch(requestedPath))
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
// match found - do any replacement needed
InBlock.gif
                    string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
InBlock.gif
InBlock.gif                    
// log rewriting information to the Trace object
InBlock.gif
                    app.Context.Trace.Write("ModuleRewriter""Rewriting URL to " + sendToUrl);
InBlock.gif
InBlock.gif                    
// Rewrite the URL
InBlock.gif
                    RewriterUtils.RewriteUrl(app.Context, sendToUrl);
InBlock.gif                    
break;        // exit the for loop
ExpandedSubBlockEnd.gif
                }

ExpandedBlockEnd.gif            }



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

改成了

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


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

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

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


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

的结果了

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

修改完了这后,我们再把此 UrlRewriter.dll COPY 到我们项目的Bin目录下。这样就结了么?没有。
首先请确定你的项目之前有按我上篇文章中写到的那样做过UrlRewriter的配置,否则请先回过头来看看那篇文章。

如果你的项目已配置过,那么,我们还要为此做以下几件事情:

1。请确定你的域名是支持泛解析的。然后你的网站为默认网站,否则将不能实现(至少我现在还没有找到好办法)
2。在IIS配置:在IIS\你的站点\属性\主目录\配置\映谢 在通配符应用程序配置处插入一个新的映谢。把可执行文件设为和上面ASPX页面同样的配置即可(注意不要勾选 “确定文件是否存在”)。(用处就是使所有请求通过 asp.net 的ISAPI来处理,只有这样才能对所有地址进行重写嘛。)
3。查看下你的网站主机头,里面的第一个主机头值必须为空,否则会出现错误的请求。后面就随你加了,看你想绑定多少域名了。(这个办法是江大鱼想出来的。为这个错误我们都想了好多办法。在这里感谢江大鱼。。。)
4。最后改写你的 web.config 文件。
把上节中说到的

None.gif    < httpHandlers >
None.gif     
< add  verb ="*"  path ="*.aspx"  type ="URLRewriter.RewriterFactoryHandler, URLRewriter"   />
None.gif     
< add  verb ="*"  path ="*.html"  type ="URLRewriter.RewriterFactoryHandler, URLRewriter"   />
None.gif  
</ httpHandlers >


改为:

None.gif < httpModules >
None.gif   
< add  type ="URLRewriter.ModuleRewriter, URLRewriter"  name ="ModuleRewriter"   />
None.gif  
</ httpModules >


(就是改用HTTP 模块来执行重写,而不用HTTP 程序,否则无法重写地址前面。)
然后就来修改我们的重写正则了:

None.gif                < RewriterRule >
None.gif                   
< LookFor > http://(.[0-9]*)\.178b2b\.com/ </ LookFor >
None.gif                   
< SendTo > ~/Search/Search_Sell.aspx?id=$1 </ SendTo >
None.gif              
</ RewriterRule >


好了,现在你输入 http://1.178b2b.com/ 就能搜索出相应分类了。但是聪明的你马上就发现。晕死,首页进不去了。呵呵。当然喽。你还得为首页加入重写正则。

None.gif                < RewriterRule >
None.gif                   
< LookFor > http://www\.178b2b\.com/ </ LookFor >
None.gif                   
< SendTo > ~/index.htm </ SendTo >
None.gif              
</ RewriterRule >



大功告成。感觉爽死了吧。呵呵。莫急,如果你二级域名指向的目录下面的页面都用的相对地址连接的图片和其它页面的话,呵呵,你有得忙了,你要全部改成如下方式:

None.gif < href =http://www.178b2b.com/cxlm/league.html  target ="_blank" > 诚信联盟 </ a >



以上就是用UrlRewriter实现二级域名的方法了。


网上很多朋友看到我这篇文章,按照我的方法做了,但是还是没有得到想要的效果,其实有些问题需要注意一下,我上篇文章也只是提出了解决这一问题的办法的最核心的内容,有些朋友可能在实际运用中可能会碰到一些问题其实可以根据自己的经验作出相应处理应该可以解决,我在这里帮大家列出几点以帮助大家快速解决问题。


1.域名解析问题
      输入了域名http://1234.abc.com,浏览器提示找不到网页。首先,你应该确认你的域名是否支持泛域名解析,就是让所有的二级,三级域名都指向你的server。其次,要保证你的站点是服务器上的默认站点,就是80端口主机头为空的站点即可以直接用IP可以访问的http://1234.abc.com,要么要提示你的站点的错误信息,要么会正确的执行你定义的URLRewrite,要么显示你的站点的首页。

2.不能执行重写的问题
      如果你确认你的域名解析是正确的,但是还是不能重写,访问http://1234.abc.com会提示 路径"/"找不到...,
如果是这样的话,你先添加  ASPNET_ISAPI的通配符应用程序映射( 这一步是必需的,Sorry!没有在上篇文章中提出来)。

操作方法:IIS站点属性 ->主目录 ->  配置


2007050819590745312001.gif

点击插入按键

2007050819591101562002.gif

选择或输入C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll
取消"确认文件是否存在"前的钩. 
确定

在来访问http://1234.abc.com  应该是没有问题了。


3. 默认首页失效,因为把请球直接交给asp.net处理,IIS定义的默认首页将会失效,出现这种情形:
访问http://www.abc.com 不能访问首页,而通过http://1234.abc.com/default.aspx可以访问。
为解决这个问题,请自己在Web.Config中设置 lookfor /  to /default.aspx 或 index.aspx ..的重写,完全可以解决问题。

 

转载于:https://www.cnblogs.com/suchenge/articles/848832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值