自己用IHttpModule接口写的URL重写组件
关键字:IHttpModule接口,asp.net2.0,url重写
1,rewriter.cs源文件
2,编译为rewriter.dll文件后,设置web.config
3,设置IIS
打开iis,右键选择需要重写的网站选择“属性”--》主目录,然后点击“配置”,在“通配符应用程序映射”下点击“插入”,可执行文件选择c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,并且把“确认文件是否存在”的复选框勾选取消掉。
备注:需要注意你的.net版本要为2+以上。。
4,最后一步就是编写重写规则文件。
规则文件名称为rule.xml,放在bin目录下,这样修改过规则后可以重写编译网站,使规则生效。
示例规则文件如下,pattern为匹配的正则,url为需要重写到的路径及参数。
备注:注意匹配的组下表从0开始
原创文章,转载请注明出处:自己用IHttpModule接口写的URL重写组件
1,rewriter.cs源文件
+展开
-C#
using System.Xml;
using System.Web;
using System.Text.RegularExpressions;
namespace ShowBoRewriter
{
/// <summary>
/// URL重写类
/// </summary>
public class Rewriter : IHttpModule
{
private HttpApplication app;
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{}
/// <summary>
/// 初始化
/// </summary>
/// <param name="context">当前的上下文对象</param>
public void Init(HttpApplication context)
{
app = context;
app.BeginRequest += new System.EventHandler(app_BeginRequest);
}
private void app_BeginRequest(object sender, System.EventArgs e)
{
Regex[] rs;
string[] urls;
if (app.Context.Application["CacheRegex"] != null)
{
rs = (Regex[])app.Context.Application["CacheRegex"];
urls = (string[])app.Context.Application["CacheUrls"];
}
else
{
object[] o = LoadRule();
rs = (Regex[])o[0];
urls = (string[])o[1];
}
string oldUrl = app.Context.Request.RawUrl;
Match m;
for (int i = 0; i < rs.Length; i++)
{
if (rs[i].IsMatch(oldUrl))
{
m = rs[i].Match(oldUrl);
string newUrl = string.Format(urls[i], GetParams(m.Groups));
app.Context.RewritePath(newUrl);
return;
}
}
}
private string[] GetParams(GroupCollection mc)
{
string[] args = new string[mc.Count - 1];
for (int i = 1; i < mc.Count; i++)
{
args[i - 1] = mc[i].Value;
}
return args;
}
private object[] LoadRule()
{
XmlDocument doc = new XmlDocument();
doc.Load(app.Server.MapPath("~/bin/rule.xml"));
XmlNodeList nl = doc.GetElementsByTagName("rule");
Regex[] rs = new Regex[nl.Count];
string[] urls = new string[nl.Count];
for (int i = 0; i < nl.Count; i++)
{
rs[i] = new Regex(nl[i].Attributes["pattern"].Value, RegexOptions.IgnoreCase | RegexOptions.Compiled);
urls[i] = nl[i].Attributes["url"].Value;
}
app.Context.Application["CacheRegex"] = rs;
app.Context.Application["CacheUrls"] = urls;
return new object[] { rs, urls };
}
}
}
using System.Web;
using System.Text.RegularExpressions;
namespace ShowBoRewriter
{
/// <summary>
/// URL重写类
/// </summary>
public class Rewriter : IHttpModule
{
private HttpApplication app;
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{}
/// <summary>
/// 初始化
/// </summary>
/// <param name="context">当前的上下文对象</param>
public void Init(HttpApplication context)
{
app = context;
app.BeginRequest += new System.EventHandler(app_BeginRequest);
}
private void app_BeginRequest(object sender, System.EventArgs e)
{
Regex[] rs;
string[] urls;
if (app.Context.Application["CacheRegex"] != null)
{
rs = (Regex[])app.Context.Application["CacheRegex"];
urls = (string[])app.Context.Application["CacheUrls"];
}
else
{
object[] o = LoadRule();
rs = (Regex[])o[0];
urls = (string[])o[1];
}
string oldUrl = app.Context.Request.RawUrl;
Match m;
for (int i = 0; i < rs.Length; i++)
{
if (rs[i].IsMatch(oldUrl))
{
m = rs[i].Match(oldUrl);
string newUrl = string.Format(urls[i], GetParams(m.Groups));
app.Context.RewritePath(newUrl);
return;
}
}
}
private string[] GetParams(GroupCollection mc)
{
string[] args = new string[mc.Count - 1];
for (int i = 1; i < mc.Count; i++)
{
args[i - 1] = mc[i].Value;
}
return args;
}
private object[] LoadRule()
{
XmlDocument doc = new XmlDocument();
doc.Load(app.Server.MapPath("~/bin/rule.xml"));
XmlNodeList nl = doc.GetElementsByTagName("rule");
Regex[] rs = new Regex[nl.Count];
string[] urls = new string[nl.Count];
for (int i = 0; i < nl.Count; i++)
{
rs[i] = new Regex(nl[i].Attributes["pattern"].Value, RegexOptions.IgnoreCase | RegexOptions.Compiled);
urls[i] = nl[i].Attributes["url"].Value;
}
app.Context.Application["CacheRegex"] = rs;
app.Context.Application["CacheUrls"] = urls;
return new object[] { rs, urls };
}
}
}
2,编译为rewriter.dll文件后,设置web.config
+展开
-XML
<system.web>
<httpModules>
<add name="Rewriter" type="ShowBoRewriter.Rewriter,Rewriter"/>
</httpModules>
</system.web>
<httpModules>
<add name="Rewriter" type="ShowBoRewriter.Rewriter,Rewriter"/>
</httpModules>
</system.web>
3,设置IIS
打开iis,右键选择需要重写的网站选择“属性”--》主目录,然后点击“配置”,在“通配符应用程序映射”下点击“插入”,可执行文件选择c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,并且把“确认文件是否存在”的复选框勾选取消掉。
备注:需要注意你的.net版本要为2+以上。。
4,最后一步就是编写重写规则文件。
规则文件名称为rule.xml,放在bin目录下,这样修改过规则后可以重写编译网站,使规则生效。
示例规则文件如下,pattern为匹配的正则,url为需要重写到的路径及参数。
备注:注意匹配的组下表从0开始
+展开
-XML
<?xml version="1.0" encoding="gb2312"?>
<rules>
<rule pattern="/read(\d+)\.html$" url="/rewiter/news.aspx?newsid={0}"/>
<rule pattern="/book(\d+)-(\d+)\.html$" url="/rewiter/bookdetails.aspx?typeid={0}&bookid={1}"/>
</rules>
<rules>
<rule pattern="/read(\d+)\.html$" url="/rewiter/news.aspx?newsid={0}"/>
<rule pattern="/book(\d+)-(\d+)\.html$" url="/rewiter/bookdetails.aspx?typeid={0}&bookid={1}"/>
</rules>
加支付宝好友偷能量挖...
原创文章,转载请注明出处:自己用IHttpModule接口写的URL重写组件