天天看点

用asp.net 2.0实现网站二级域名

用asp.net 2.0实现网站二级域名 有关于URL的重写,本文也只是拿来主意。相继有MS的组件“URLRewriter”和在Global.asax里的“Application_BeginRequest()”编码方式,以及IIS里的ISAPI设置。 娜列下来,实现方法也都很简单。 方法一:MS组件 这里也不用详解了,相关请看: http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx 用法很简单,只需要把组件URLRewriter.dll拷到应用程序的bin目录下,然后在web.config下加入如下代码: 在中加入: ~/(/d{4})/(/d{2})/Default/.aspx ~/Default.aspx?ID=$1 然后在中加入: 最后在地址栏上键入:http://localhost/Test/2004/12/News.aspx 效果出来了。 上面的~/(/d{4})/(/d{2})/News/.aspx这句这正则表达式URL,即被重写的URL,而~/Default.aspx?ID=$1这一句为原始URL地址。其中的$1为第一个正则表达式值(上面例子为:2004),以此类推,第二个即为$2 方法二:Application_BeginRequest() 在应用程序中新建一个XML文件,文件内容为:文件名ReWriter.config

(.*)/News/(/d{4})/Default/.aspx ../../Default.aspx?id=$2&type=$3 在Global.asax文件中的Application_BeginRequest(Object sender, EventArgs e)加入代码: try { string path=Server.MapPath("~/ReWriter.config"); XPathDocument myXPathDocument = new XPathDocument(path); XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator(); XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select ("//rule"); System.Text.RegularExpressions.Regex oReg; string ReWriteUrl; while (myXPathNodeIterator.MoveNext()) { //oReg=new Regex(oNode.SelectSingleNode("url/text()").Value); XPathNavigator nav2 = myXPathNodeIterator.Current.Clone(); string oldString="",newString=""; XPathNodeIterator it2 = nav2.Select("old"); while(it2.MoveNext()) { oldString = it2.Current.Value; break; } it2 = nav2.Select("new"); while(it2.MoveNext()) { newString = it2.Current.Value; break; } if(oldString != "" && newString != "") { oReg = new System.Text.RegularExpressions.Regex(oldString); if(oReg.IsMatch(Request.Url.ToString())) { ReWriteUrl = oReg.Replace(Request.Url.ToString(),newString); HttpContext.Current.RewritePath(ReWriteUrl); break; } } } } catch { } 最后在地址栏上键入:http://localhost/Test/News/2004/Default.aspx 效果出来了。 昨天写了个URL重写,因为在重写后的URL里有一个小小的Bug的,就是在Post数据时会把原URL里的地址变成GET。 (ASP.net的URL重写文一) 比如原地址URL为:http://localhost/Test/Default.aspx 重写后的URL:http://localhost/Test/2004/12/News.aspx 而在Default.aspx文件里有Post数据(如Post文本)。那么这时重写后的URL就会变为:http://localhost/Test/2004/12/News.aspx?ID=12 显然,这不是我们想要的URL也不是标准的。 其实,有细读过在MS上的MSDN里的这篇文章的朋友都知道,里面已经有讲述了且问题也已经解决了的。 http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx 可能上面链接的文档相对较长,有朋友读完到URL重写后就没再往下看了。在文章下头里有细说明,怎么个把Form的Action清除掉。这里我所插一句的是:在ASP.net的页面WebForm里,一个页面只能有一个Form,但同时,这个Form的Action是不可变的(即只能Post数据回本页面)。如需要变动,则要自己写一个Form控件,此控件继承System.Web.UI.HtmlControls.HtmlForm接口。 这里是URLRewriter的源码下载: http://upserver2.ys168.com/ys168up/D1/ys1.aspx?f=MSDNURLRewriting.msiy71z73f8b3f8b4b0f8z95b6b1f9b5f9f5f9b1f8b0b2b1f6e09e15e05e24b1b0f2b0f9f9b1f6b7f8b1z 在这个源码中,找到URLRewriter.dll和ActionlessForm.dll这两个DLL文件。其实一整个源码就只有这两个文件有用的。第一个不用多说了,前文已经说了怎么用这个DLL。对于ActionlessForm.dll这个就是一个控件,用法也很简单: 首先把ActionlessForm.dll拷入你的项目中的bin目录,然后在你的VS.net的项目中引用这个dll。再在你原有的(即没重写的).aspx页面中 第一步:把这句加于代码顶部:

第二步:

替换成: 和 OK,现在你可以再运行程序试试了。---------- 附:为什么URL就会变为:http://localhost/Test/2004/12/News.aspx?ID=12 其实很简单,因为在web.config中有这样的一句: ~/Default.aspx?ID=$2 在没有替换form之前,你查看页面的源码就可以看到,你的form的Action是到(以上面的例子):Default.aspx?ID=12 即.aspx页面最后生成的HTML是:

还有,如果想用URL重写后的格式为以目录形式即不用加Default.aspx: http://localhost/Test/2004/12 则要新建相应的目录和文件Default.aspx。如上例子:http://localhost/Test/2004/12 则要新建2004目录和在此目录下新建12目录,再在12目录下新建Default.aspx文件。文件内容可为空。 至于为什么,是因为IIS如没有找到目录或文件时会报错。

继续阅读