第一種是在頁面global.asax中,相關代碼如下:

void Application_BeginRequest(
object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
string oldurl = context.Request.Path.ToLower();
if ( ( oldurl.IndexOf( " - ") > 0 && oldurl.IndexOf( " . ") == - 1) || (oldurl.IndexOf( " - ") > 0 && oldurl.IndexOf( " aspx ") > 0) )
{
string[] url = oldurl.Substring(oldurl.LastIndexOf( " / ") + 1).Replace( " .aspx ", "").Split( ' - ');
string path = oldurl.Substring( 0, oldurl.LastIndexOf( " / ") + 1);
// file
string file = url[ 0];
file = file.Replace( " about ", " detail ");
file = file.Replace( " news ", " list ");
file = file.Replace( " down ", " detail ");
file = file.Replace( " case ", " album ");
file = file.Replace( " contact ", " detail ");
// query
string query = "";
for ( int i= 1;i<url.Length;i++ )
{
if (url[i] != "")
{
switch (i)
{
case 1:
query += " id= " + url[i];
break;
case 2:
query += " &page= " + url[i];
break;
case 3:
query += " &key= " + url[i];
break;
case 4:
query += " &v1= " + url[i];
break;
case 5:
query += " &v2= " + url[i];
break;
case 6:
query += " &v3= " + url[i];
break;
case 7:
query += " &v4= " + url[i];
break;
case 8:
query += " &v5= " + url[i];
break;
case 9:
query += " &v6= " + url[i];
break;
case 10:
query += " &v7= " + url[i];
break;
}
}
}
// newurl
string newurl = path + file + " .aspx? " + query;
if( context.Request.ServerVariables[ " QUERY_STRING "] != null && context.Request.ServerVariables[ " QUERY_STRING "] != "" )
newurl += " & " + context.Request.ServerVariables[ " QUERY_STRING "];
// Response.Write(newurl);
context.RewritePath(newurl);
}
{
HttpContext context = ((HttpApplication)sender).Context;
string oldurl = context.Request.Path.ToLower();
if ( ( oldurl.IndexOf( " - ") > 0 && oldurl.IndexOf( " . ") == - 1) || (oldurl.IndexOf( " - ") > 0 && oldurl.IndexOf( " aspx ") > 0) )
{
string[] url = oldurl.Substring(oldurl.LastIndexOf( " / ") + 1).Replace( " .aspx ", "").Split( ' - ');
string path = oldurl.Substring( 0, oldurl.LastIndexOf( " / ") + 1);
// file
string file = url[ 0];
file = file.Replace( " about ", " detail ");
file = file.Replace( " news ", " list ");
file = file.Replace( " down ", " detail ");
file = file.Replace( " case ", " album ");
file = file.Replace( " contact ", " detail ");
// query
string query = "";
for ( int i= 1;i<url.Length;i++ )
{
if (url[i] != "")
{
switch (i)
{
case 1:
query += " id= " + url[i];
break;
case 2:
query += " &page= " + url[i];
break;
case 3:
query += " &key= " + url[i];
break;
case 4:
query += " &v1= " + url[i];
break;
case 5:
query += " &v2= " + url[i];
break;
case 6:
query += " &v3= " + url[i];
break;
case 7:
query += " &v4= " + url[i];
break;
case 8:
query += " &v5= " + url[i];
break;
case 9:
query += " &v6= " + url[i];
break;
case 10:
query += " &v7= " + url[i];
break;
}
}
}
// newurl
string newurl = path + file + " .aspx? " + query;
if( context.Request.ServerVariables[ " QUERY_STRING "] != null && context.Request.ServerVariables[ " QUERY_STRING "] != "" )
newurl += " & " + context.Request.ServerVariables[ " QUERY_STRING "];
// Response.Write(newurl);
context.RewritePath(newurl);
}
第二種方法是在HttpModule.cs中,代碼如下:

public
class HttpModule : IHttpModule
{
private const RegexOptions regexOptions = RegexOptions.IgnoreCase | RegexOptions.Compiled;
private static readonly Regex regexFileName = new Regex( @" .*?/([^./]*)\.aspx(.*) ", regexOptions);
private static readonly Regex regexRewritePath = new Regex( @" ^.*?/(\w*)(-?(\w+)-([\w,\|,%]+))+\.aspx ", regexOptions);
public void Dispose()
{
}
public void Init(HttpApplication httpApplication)
{
httpApplication.BeginRequest += ReUrl_BeginRequest;
}
private static void ReUrl_BeginRequest( object sender, EventArgs e)
{
Globals.Catch(
() =>
{
var context = ((HttpApplication)sender).Context;
var request = context.Request;
var url = request.Url;
if (!VerifyUrl(url))
{
string input = url.PathAndQuery.ToLower();
// Loger.Debug("PathAndQuery-->" + input);
// Loger.Debug("AbsolutePath-->" + url.AbsolutePath);
// Loger.Debug("AbsoluteUri-->" + url.AbsoluteUri);
// Loger.Debug("DnsSafeHost-->" + url.DnsSafeHost);
// Loger.Debug("LocalPath-->" + url.LocalPath);
// Loger.Debug("AppDomain.CurrentDomain.BaseDirectory-->" + AppDomain.CurrentDomain.BaseDirectory);
// Loger.Debug("Globals.GlobalsVirtualFilePath-->" + Globals.GlobalsVirtualFilePath);
if (input.StartsWith(Globals.GlobalsVirtualFilePath))
input = input.Remove( 0, Globals.GlobalsVirtualFilePath.Length);
string viewmode = Globals.ViewMode;
var themeName = request.QueryString[ " theme "] ?? "";
if ( string.IsNullOrEmpty(themeName))
{
themeName = Globals.ThemeName;
}
if (input == " / ")
input = " /index.aspx ";
if (viewmode == " Rewrite ")
{
Loger.Debug( " now input--> " + input);
Match match = regexRewritePath.Match(input);
if (match.Success && match.Groups.Count == 5)
{
var captures3 = match.Groups[ 3].Captures;
var captures4 = match.Groups[ 4].Captures;
var itemCount = match.Groups[ 3].Captures.Count;
var list = new List< string>();
for ( var i = 0; i < itemCount; i++)
{
list.Add( string.Concat(captures3[i].Value, " = ", captures4[i].Value));
}
context.RewritePath(Globals.AspxFileUrl(themeName, match.Groups[ 1].Value + " .aspx? " + string.Join( " & ", list.ToArray())));
return;
}
}
var fileName = regexFileName.Match(request.Path.ToLower()).Groups[ 1].ToString();
if ( string.IsNullOrEmpty(fileName))
return;
new ConvertTheme(context)
{
ThemeName = themeName,
ViewMode = viewmode
}.Display(fileName);
}
});
}
private static bool VerifyUrl(Uri uri)
{
var url = uri.AbsolutePath.ToLower();
if (url.StartsWith(Globals.GlobalsVirtualFilePath))
url = url.Remove( 0, Globals.GlobalsVirtualFilePath.Length);
return uri.IsFile
|| url.IndexOf( " site ") != - 1
|| url.IndexOf( " sys ") != - 1
|| url.IndexOf( " html ") != - 1
|| url.IndexOf( " user ") != - 1
|| url.IndexOf( " bbs ") != - 1
|| url.IndexOf( " _module.aspx ") != - 1
|| url.IndexOf( " webresource.axd ") != - 1
|| url.IndexOf( " scriptresource.axd ") != - 1;
}
}
{
private const RegexOptions regexOptions = RegexOptions.IgnoreCase | RegexOptions.Compiled;
private static readonly Regex regexFileName = new Regex( @" .*?/([^./]*)\.aspx(.*) ", regexOptions);
private static readonly Regex regexRewritePath = new Regex( @" ^.*?/(\w*)(-?(\w+)-([\w,\|,%]+))+\.aspx ", regexOptions);
public void Dispose()
{
}
public void Init(HttpApplication httpApplication)
{
httpApplication.BeginRequest += ReUrl_BeginRequest;
}
private static void ReUrl_BeginRequest( object sender, EventArgs e)
{
Globals.Catch(
() =>
{
var context = ((HttpApplication)sender).Context;
var request = context.Request;
var url = request.Url;
if (!VerifyUrl(url))
{
string input = url.PathAndQuery.ToLower();
// Loger.Debug("PathAndQuery-->" + input);
// Loger.Debug("AbsolutePath-->" + url.AbsolutePath);
// Loger.Debug("AbsoluteUri-->" + url.AbsoluteUri);
// Loger.Debug("DnsSafeHost-->" + url.DnsSafeHost);
// Loger.Debug("LocalPath-->" + url.LocalPath);
// Loger.Debug("AppDomain.CurrentDomain.BaseDirectory-->" + AppDomain.CurrentDomain.BaseDirectory);
// Loger.Debug("Globals.GlobalsVirtualFilePath-->" + Globals.GlobalsVirtualFilePath);
if (input.StartsWith(Globals.GlobalsVirtualFilePath))
input = input.Remove( 0, Globals.GlobalsVirtualFilePath.Length);
string viewmode = Globals.ViewMode;
var themeName = request.QueryString[ " theme "] ?? "";
if ( string.IsNullOrEmpty(themeName))
{
themeName = Globals.ThemeName;
}
if (input == " / ")
input = " /index.aspx ";
if (viewmode == " Rewrite ")
{
Loger.Debug( " now input--> " + input);
Match match = regexRewritePath.Match(input);
if (match.Success && match.Groups.Count == 5)
{
var captures3 = match.Groups[ 3].Captures;
var captures4 = match.Groups[ 4].Captures;
var itemCount = match.Groups[ 3].Captures.Count;
var list = new List< string>();
for ( var i = 0; i < itemCount; i++)
{
list.Add( string.Concat(captures3[i].Value, " = ", captures4[i].Value));
}
context.RewritePath(Globals.AspxFileUrl(themeName, match.Groups[ 1].Value + " .aspx? " + string.Join( " & ", list.ToArray())));
return;
}
}
var fileName = regexFileName.Match(request.Path.ToLower()).Groups[ 1].ToString();
if ( string.IsNullOrEmpty(fileName))
return;
new ConvertTheme(context)
{
ThemeName = themeName,
ViewMode = viewmode
}.Display(fileName);
}
});
}
private static bool VerifyUrl(Uri uri)
{
var url = uri.AbsolutePath.ToLower();
if (url.StartsWith(Globals.GlobalsVirtualFilePath))
url = url.Remove( 0, Globals.GlobalsVirtualFilePath.Length);
return uri.IsFile
|| url.IndexOf( " site ") != - 1
|| url.IndexOf( " sys ") != - 1
|| url.IndexOf( " html ") != - 1
|| url.IndexOf( " user ") != - 1
|| url.IndexOf( " bbs ") != - 1
|| url.IndexOf( " _module.aspx ") != - 1
|| url.IndexOf( " webresource.axd ") != - 1
|| url.IndexOf( " scriptresource.axd ") != - 1;
}
}