using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace YouXi.Components
{
public class HttpModule : IHttpModule
{
IHttpModule 成員
}
}
UrlRewriter類,重寫URL,並設置重寫路徑,
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace YouXi.Components
{
public class UrlRewriter
{
/// <summary>
/// url路徑重寫
/// </summary>
/// <param name="rawUrl"></param>
public static void Rewriter()
{
//這兒處理url重寫
//string s_NewUrl = null;
//bool IsMatch = false;
HttpRequest req = HttpContext.Current.Request;
string rawUrl = req.Url.ToString();//.Remove(0, 7).ToLower();
if (!rawUrl.EndsWith(".shtm"))
return;
if(CommonHelper.UrlReWriterHelper.Rewrite(ref rawUrl))
HttpContext.Current.RewritePath(rawUrl);
}
}
}
重寫初始化類
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Xml;
using System.Text.RegularExpressions;
namespace CommonHelper
{
public class UrlReWriterHelper
{
private static string configFile = "/Configs/UrlReWriter.Config";
public List<UrlReWriterRule> Rules;
private static UrlReWriterHelper Instance { get; set; }
private bool _Enabled;
private bool _Reverse;
/// <summary>
/// 反向匹配
/// </summary>
public bool Reverse
{
get { return _Reverse; }
}
/// <summary>
/// 正向匹配
/// </summary>
public bool Enabled
{
get { return _Enabled; }
}
/// <summary>
/// 初始化重寫規則
/// </summary>
static UrlReWriterHelper()
{
Instance = new UrlReWriterHelper();
Instance.Rules = new List<UrlReWriterRule>();
string file = HttpContext.Current.Server.MapPath(configFile);
XmlDocument xd = new XmlDocument();
xd.Load(file);
XmlElement xe = xd.DocumentElement;
bool enabled = true;
if (xe.Attributes["enabled"] != null)
{
enabled = Boolean.TryParse(xe.Attributes["enabled"].Value, out enabled);
}
Instance._Enabled = enabled;
bool reverse = true;
if (xe.Attributes["reverse"] != null)
{
reverse = Boolean.TryParse(xe.Attributes["reverse"].Value, out reverse);
}
Instance._Reverse = reverse;
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn.NodeType == XmlNodeType.Element)
{
UrlReWriterRule re = new UrlReWriterRule(xn);
Instance.Rules.Add(re);
}
}
}
/// <summary>
/// 按配置的規則進行路徑重寫並將最後值改寫給參數,返回值表示是否進行重寫
/// </summary>
/// <param name="rawUrl">可以根據此值進行重寫操作</param>
/// <returns></returns>
public static bool Rewrite(ref string rawUrl)
{
if (string.IsNullOrEmpty(rawUrl.Trim()))
return false;
UrlReWriterHelper config = UrlReWriterHelper.Instance;
if (!config.Enabled)
return false;
List<UrlReWriterRule> Rules = config.Rules;
if (Rules == null || Rules.Count == 0)
return false;
foreach (UrlReWriterRule rule in Rules)
{
Regex r = new Regex(rule.Pattern, RegexOptions.IgnoreCase);
if (r.IsMatch(rawUrl))
{
string s_url = r.Replace(rawUrl, rule.Url);
rawUrl = s_url.Replace("/","/");
int start = rawUrl.IndexOf("/", 7);
if (start == 0)
return true;
rawUrl = rawUrl.Substring(start);
return true;
}
}
return false;
}
}
}
UrlReWriterRule規則類,
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace CommonHelper
{
/// <summary>
/// URL重寫配置項
/// </summary>
public class UrlReWriterRule
{
...
...
public UrlReWriterRule()
{
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="xn">XML節點</param>
public UrlReWriterRule(XmlNode xn)
{
try
{
if (xn.SelectSingleNode("pattern") != null)
_Pattern = xn.SelectSingleNode("pattern").InnerText;
else if(xn.Attributes["pattern"]!=null)
_Pattern = xn.Attributes["pattern"].Value;
if (xn.SelectSingleNode("url") != null)
_Url = xn.SelectSingleNode("url").InnerText;
else if (xn.Attributes["url"] != null)
_Url = xn.Attributes["url"].Value;
if (xn.SelectSingleNode("repattern") != null)
_RePattern = xn.SelectSingleNode("repattern").InnerText;
else if (xn.Attributes["repattern"] != null)
_RePattern = xn.Attributes["repattern"].Value;
if (xn.SelectSingleNode("reurl") != null)
_ReUrl = xn.SelectSingleNode("reurl").InnerText;
else if (xn.Attributes["reurl"] != null)
_ReUrl = xn.Attributes["reurl"].Value;
}
catch (Exception e)
{
throw (e);
}
}
}
}
UrlReWriter.Config 重寫規則config文件
<UrlReWriter enabled="true" reverse="false">
<!--鏈接到其他剛站的URL中轉-->
<url pattern="/go/(d+).shtm" url="/go/reurl.ashx?urlid=$1"
repattern="^/games/reurl.ashx?urlid=(d+)$" reurl="/games/$1.shtm"></url>
<!--Tags頁面-->
<url pattern="/tags/([^/.]+).shtm" url="/go/TagGameList.aspx?tagName=$1"
repattern="^/go/TagGameList.aspx?tagName=([wW+]+)$" reurl="/tags/$1.shtm"></url>
<!--Tags頁面-->
<url pattern="/tags/([^/]+)/(d+).shtm" reurl="/tags/$1/$2.shtm">
<url>
<![CDATA[/go/TagGameList.aspx?tagName=$1&pageIndex=$2]]></url>
<repattern><![CDATA[^/go/TagGameList.aspx?tagName=([^&]+)&(d+)$]]></repattern>
</url>
</UrlReWriter>