备注:在读本文的时候,你需要具备一些.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/