2005使用UrlWritter做真正的二级域名

备注:在读本文的时候,你需要具备一些.net的基础知识与泛域名相关的知识,如果不具备这些知识,建议你先到网上搜索相关知识。
前段时间公司的一个项目要用到二级域名,需求方对原来的泛域名解析不太满意,原来的域名有两种方案,一种是二级域名只做指向作用,到访问子站点的时候就在地址栏带参数,比如访问张三子站的新闻列表地址就会变成: http://iove.net/news.aspx?domain=zs;另一种是生成静态页,为每个子站在主目录下生成一个文件夹,将静态页生成在这个目录中,动态数据采用Ajax从服务器获取,比如访问张三子站的新闻列表地址就可以这样访问: http://zs.iove.net/users/zs/news.html,我来简单说明一下两种方案的优劣。
第一种方案第二种方案
频道写入IO
文件的管理
搜索引擎的友好性不友好非常友好
速度较快
地址的友好性非常不友好比较友好
第二种方案只所以对搜索引擎非常友好是因为采用了静态页,但地址栏的问题并未彻底解决,因为 http://zs.iove.net/users/zs/news.html使用 http://ls.iove.net/users/zs/news.html也能访问,这样的话用户会很迷惑,需求方对这样的解决方案也不是很满意,于是决定寻求其它的解决方案。
到网上查了相关的资料,发现在.Net中,可以使用UrlWriter来解决二级域名的问题。原理很简单,IIS会根据请求的扩展名将请求转交给注册的程序或类库,工作原理如图:
(图1)
到微软件的网站下了一个UrlWriter的安装包,简单地说一下,微软下载的是基于2003的,如果你用的是2005,可能会进行一些转换,这个转换过程是安全的,但转换完成了后并不能工作,我到网上找了找,发现网上有相关的解决的方案,但根据网友提供的解决方案始终不能解决问题,汗一个,难道我下错版本了?
根据网上提供的线索,可以基本确定不能使用二级域名的原因是因为UrlWriter在取地址的时候,只取文件地址而没有取全部的URL,知道原因就好办了,自己进行调试,还得靠自己啊。
经过调试,发现主要了在RewriterFactoryHandler.cs文件上,修改其中的GetHandler方法,主要的修改可以参看代码,我在代码中有详细的说明,具体代码如下:
 public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
 {
     // log info to the Trace object...
     context.Trace.Write("RewriterFactoryHandler", "Entering RewriterFactoryHandler");
     string sendToUrl = url;
     string filePath = pathTranslated;   
 
     //获取完整的url
     string requestURL = context.Request.IsAuthenticated ? "https://" : "http://";      //判断协议类型
     requestURL += 80 == context.Request.Url.Port ? "" : context.Request.Url.Port.ToString();              //是否要加上端口
     requestURL += context.Request.ServerVariables["SERVER_NAME"];
     requestURL += context.Request.Path;   
 
     //如果是www或者localhost就忽略,当然也可以将忽略列表中入web.config文件中,弹性更大
     if (requestURL.ToLower().IndexOf("www.") == -1 && requestURL.ToLower().IndexOf("localhost") == -1)
     {
         // get the configuration rules
         RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;   
 
         // iterate through the rules
         for (int i = 0; i < rules.Count; i++)
         {
             // Get the pattern to look for (and resolve its URL)
             string lookFor = "^" + RewriterUtils.ResolveUrl(context.Request.ApplicationPath, rules[i].LookFor) + "$";
             // Create a regular expression object that ignores case...
             Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);   
 
             // Check to see if we've found a match
             //注意这里,是用正则匹配requestURL(完整的URL)
             if (re.IsMatch(requestURL))
             {
                 // do any replacement needed
                 //这里也是将requestURL(完整的URL)进行替换
                 sendToUrl = RewriterUtils.ResolveUrl(context.Request.ApplicationPath, re.Replace(requestURL, rules[i].SendTo));   
 
                 // log info to the Trace object...
                 context.Trace.Write("RewriterFactoryHandler", "Found match, rewriting to " + sendToUrl);   
 
                 // Rewrite the path, getting the querystring-less url and the physical file path
                 string sendToUrlLessQString;
                 RewriterUtils.RewriteUrl(context, sendToUrl, out sendToUrlLessQString, out filePath);   
 
                 // return a compiled version of the page
                 context.Trace.Write("RewriterFactoryHandler", "Exiting RewriterFactoryHandler"); // log info to the Trace object...
                 return PageParser.GetCompiledPageInstance(sendToUrlLessQString, filePath, context);
             }
         }
     }   
 
     // if we reached this point, we didn't find a rewrite match
     context.Trace.Write("RewriterFactoryHandler", "Exiting RewriterFactoryHandler"); // log info to the Trace object...
     return PageParser.GetCompiledPageInstance(url, filePath, context);
 }
只需要改动这些,二级域名可以了,虽然是采用动态页,但对于搜索引擎来说是透明的,搜索引擎的?可以得到解决,地址的友好性也得到解决,需求方也觉得很满意,一个皆大欢喜的结局
  

注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/

转载于:https://www.cnblogs.com/conis/archive/2007/08/06/1720572.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值