C# URL 重寫與反重寫

在URL重寫中,最重要的莫過於IHttpModule接口了,先看下代碼:
using System;
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;
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;
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 getset; }

        
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;
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文件
<?xml version="1.0" encoding="utf-8" ?>
<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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章