public class UrlRewritePathConfig
{
private static readonly string CacheKey = "Byecity_Information_RewritePath_CONFIGURATION";
private static readonly object LOCK_CONFIG = new object();
private Dictionary<string, ItemData> itemDatas = new Dictionary<string, ItemData>();
public Dictionary<string, ItemData> ItemDatas
{
get
{
return itemDatas;
}
}
static UrlRewritePathConfig instance;
/// <summary>
/// 配置实例
/// </summary>
public static UrlRewritePathConfig Instance
{
get
{
if (instance != null)
return instance;
instance = ByecityCache.Get(CacheKey) as UrlRewritePathConfig;
if (instance != null)
return instance;
lock (LOCK_CONFIG)
{
instance = ByecityCache.Get(CacheKey) as UrlRewritePathConfig;
if (instance != null)
return instance;
instance = new UrlRewritePathConfig();
//从配置文件中加载XML节点
XmlNode nodes = ByecityConfiguration.GetConfig().GetConfigSection("Byecity/RewritePath");
//属性
XmlAttribute att;
XmlAttributeCollection itemAttributes;
foreach (XmlNode itemNode in nodes.ChildNodes)
{
if (itemNode.NodeType == XmlNodeType.Comment)
continue;
itemAttributes = itemNode.Attributes;
ItemData item = new ItemData();
att = itemAttributes["Name"];
if (att != null)
item.Name = att.Value;
if (instance.ItemDatas.ContainsKey(item.Name))
continue;
att = itemAttributes["Page"];
if (att != null)
item.Page = att.Value;
att = itemAttributes["QueryString"];
if (att != null)
item.QueryString = att.Value;
att = itemAttributes["Pattern"];
if (att != null)
item.Pattern = att.Value;
att = itemAttributes["Format"];
if (att != null)
item.Format = att.Value;
instance.ItemDatas.Add(item.Name, item);
}
//缓存依赖
CacheDependency dep = new CacheDependency(
new string[] { HttpContext.Current.Server.MapPath(string.Format("~/{0}", ConfigurationManager.AppSettings["ByecityConfig"])) },
new string[] { ByecityConfiguration.CacheKey, CacheKey });
//将配置插入缓存
ByecityCache.Insert(CacheKey, instance, dep, ByecityCache.DayFactor);
}
return instance;
}
}
}
public class ItemData
{
private string name;
/// <summary>
///
/// </summary>
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private string pattern = "";
/// <summary>
///
/// </summary>
public string Pattern
{
get
{
return pattern;
}
set
{
pattern = value;
}
}
private string page = "";
/// <summary>
///
/// </summary>
public string Page
{
get
{
return page;
}
set
{
page = value;
}
}
private string queryString = "";
/// <summary>
///
/// </summary>
public string QueryString
{
get
{
return queryString;
}
set
{
queryString = value;
}
}
private string format = "";
/// <summary>
///
/// </summary>
public string Format
{
get
{
return format;
}
set
{
format = value;
}
}
}
public class UrlRewriteModule : IHttpModule
{
#region IHttpModule 成员
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
static Dictionary<string, Regex> regexs = new Dictionary<string, Regex>();
static Dictionary<string, string> redirects = new Dictionary<string, string>();
void context_BeginRequest(object sender, EventArgs e)
{
string url = HttpContext.Current.Request.Url.AbsolutePath.ToLower();
string extention = Path.GetExtension(url);
string dUrl;
string replace, newUrl;
dUrl = HttpUtility.UrlDecode(url);
if (!extention.Equals(".html", StringComparison.OrdinalIgnoreCase))
return;
Regex regex;
ItemData item;
foreach (var kvp in UrlRewritePathConfig.Instance.ItemDatas)
{
item = kvp.Value;
if (regexs.ContainsKey(item.Name))
{
regex = regexs[item.Name];
}
else
{
regex = new Regex(item.Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
regexs.Add(item.Name, regex);
}
if (!regex.IsMatch(dUrl))
continue;
#region 301
if (kvp.Key.Equals("City_ArticleDetail", StringComparison.OrdinalIgnoreCase) || kvp.Key.Equals("Country_ArticleDetail", StringComparison.OrdinalIgnoreCase))
{
string redirectUrl;
if (redirects.ContainsKey(dUrl))
{
redirectUrl = redirects[dUrl];
}
else
{
var match = regex.Match(dUrl);
var artId = match.Groups[match.Groups.Count - 3].Value;
redirectUrl = UrlUtility.GetFullRewriteUrl("ArticleDetail", artId);
redirects.Add(dUrl, redirectUrl);
}
HttpContext.Current.Response.StatusCode = 301;
HttpContext.Current.Response.AppendHeader("Location", redirectUrl);
HttpContext.Current.Response.End();
}
#endregion
replace = string.Format("{0}?{1}", item.Page, item.QueryString);
newUrl = regex.Replace(dUrl, replace);
HttpContext.Current.RewritePath(newUrl, false);
return;
}
UrlUtility.Return404();
}
#endregion
}
<?xml version="1.0" encoding="utf-8"?>
<Byecity>
<Core CookieDomain="" CookieTimeOut="30" PersistentTimeOut="43200" cacheFactor="15"/>
<RewritePath>
<!--图片首页-->
<Item Name="Media_Image" Page="/gallery/imagelist.aspx" QueryString="" Pattern="/image.html$" Format="/image.html"></Item>
</RewritePath>
</Byecity>