下面的文章只是我自己的一种思路,不对的地方还请多指教
现在的BLOG注册后的帐号都是在网站域名后加一个目录,比如用帐号"dudu"注册后,直接访问www.cnblogs.com/dudu就可以了。但我猜想服务器不会为每个帐号创建一个目录,那如何实现的呢,虚URL是一种解决方法。其实说起来很简单,就是在Global.aspx的BeginRequest事件中捕捉用户请求的路径,如果有特定用户信息,则以这个用户为参数,重定向到服务器上特定的页面。比如:
<Script Language="C#" Runat="Server">
void Application_BeginRequest(object sender, EventArgs e) {
string strPageOwner;
string strCurrentPath;
string strUserPath;
string strUserName;
strCurrentPath = Request.Path.ToLower();
//检查请求的路径是否为网站的实际页面,只有请求虚Url才重定向
if (strCurrentPath.IndexOf( "/site/" ) == -1
&& strCurrentPath.IndexOf( "userpage.aspx" ) == -1
&& strCurrentPath.IndexOf( "default.aspx" ) == -1)
{
strUserName = GetUserPathByUrl(Request.Path);//根据请求的路径得出用户信息
strUserPath = String.Format("~/userpage.aspx?username={0}",strUserName );
Context.RewritePath( strUserPath );
}
}
//根据请求路径得出用户信息,如:/pentium/archive/33431.aspx,得出用户pentium
string GetPathByUrl(string strUrl)
{
strUrl=strUrl.Replace("/","\\");
while (strUrl.LastIndexOf("\\")!=0)
{
strUrl=System.IO.Path.GetDirectoryName(strUrl);
}
if(strUrl.StartsWith("\\"))
strUrl=strUrl.Remove(0,1);
return strUrl;
}
</Script>
void Application_BeginRequest(object sender, EventArgs e) {
string strPageOwner;
string strCurrentPath;
string strUserPath;
string strUserName;
strCurrentPath = Request.Path.ToLower();
//检查请求的路径是否为网站的实际页面,只有请求虚Url才重定向
if (strCurrentPath.IndexOf( "/site/" ) == -1
&& strCurrentPath.IndexOf( "userpage.aspx" ) == -1
&& strCurrentPath.IndexOf( "default.aspx" ) == -1)
{
strUserName = GetUserPathByUrl(Request.Path);//根据请求的路径得出用户信息
strUserPath = String.Format("~/userpage.aspx?username={0}",strUserName );
Context.RewritePath( strUserPath );
}
}
//根据请求路径得出用户信息,如:/pentium/archive/33431.aspx,得出用户pentium
string GetPathByUrl(string strUrl)
{
strUrl=strUrl.Replace("/","\\");
while (strUrl.LastIndexOf("\\")!=0)
{
strUrl=System.IO.Path.GetDirectoryName(strUrl);
}
if(strUrl.StartsWith("\\"))
strUrl=strUrl.Remove(0,1);
return strUrl;
}
</Script>
更复杂的逻辑可以用httpModule实现,这仅仅是一种思路:截获用户请求的地址,得出所请求的信息,然后重定向页面