zoukankan      html  css  js  c++  java
  • ASP.NET 自定义URL重写 分类: ASP.NET 2014-10-31 16:05 175人阅读 评论(0) 收藏

    一.功能说明:
    可以解决类似 http://****/news 情形,Url路径支持正则匹配。

    二.操作步骤:
    1.增加URL重写模块:
    using System;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Web;
    using System.Xml;
    /// <summary>
    /// URL重写Module
    /// </summary>
    public class UrlRewriteModule : IHttpModule
    {
        #region IHttpModule Members
        public virtual void Init(HttpApplication context)
        {
            context.BeginRequest += ApplicationBeginRequest;
        } 
        public virtual void Dispose()
        {
        }
        #endregion
        public bool IsExcludedPath(string relUrl)
        {
            string fileExt = Path.GetExtension(relUrl);
            if (!string.IsNullOrEmpty(fileExt)
                && (fileExt.ToLower() == ".axd" ||
                fileExt.ToLower() == ".jpg" ||
                fileExt.ToLower() == ".png" ||
                fileExt.ToLower() == ".gif" ||
                fileExt.ToLower() == ".swf" ||
                fileExt.ToLower() == ".bmp"
                ))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        ///   
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        public void ApplicationBeginRequest(object source, EventArgs e)
        {
            var application = (HttpApplication)source;
            HttpContext context = application.Context;
            try
            {
                string path = context.Request.Path;
                string file = Path.GetFileName(path);
                if (IsExcludedPath(path))
                {
                    return;
                }
                if (file != null && HttpContext.Current != null)
                {
                    string rewriteConfig = HttpContext.Current.Server.MapPath("~/Config/RewriterConfig.config");
                    if (File.Exists(rewriteConfig))
                    {
                        var xml = new XmlDocument();
                        xml.Load(rewriteConfig);
                        XmlNodeList rules = xml.SelectNodes("RewriterConfig/Rules/RewriterRule");
                        if (rules != null)
                        {
                            foreach (XmlNode rule in rules)
                            {
                                string lookFor = "";
                                string sendTo = "";
                                XmlNode lookForNode = rule.SelectSingleNode("LookFor");
                                if (lookForNode != null)
                                {
                                    lookFor = lookForNode.InnerText;
                                }
                                XmlNode sendToNode = rule.SelectSingleNode("SendTo");
                                if (sendToNode != null)
                                {
                                    sendTo = sendToNode.InnerText;
                                }
                                if (!string.IsNullOrEmpty(lookFor) && !string.IsNullOrEmpty(sendTo))
                                {
                                    string regeRule = Regex.Escape(lookFor);
                                    var regex = new Regex("^(?i)" + regeRule + "$"RegexOptions.Compiled);
                                    //匹配无后缀时路径
                                    if (string.IsNullOrEmpty(file))
                                    {
                                        if (context.Request.ApplicationPath != null)
                                        {
                                            var subPath = path.Substring(context.Request.ApplicationPath.Length).TrimStart('/').TrimEnd('/');
                                            if (regex.Match(subPath).Success)
                                            {
                                                context.RewritePath(Path.Combine(context.Request.ApplicationPath, sendTo));
                                                break;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if (regex.Match(file).Success)
                                        {
                                            context.RewritePath(sendTo);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                context.Response.Clear();
                context.Response.Write(ex.Message);
                context.Response.End();
            }
        }
    }
    2.增加Url重写配置,放到网站根目录下Config文件夹下:~/Config/RewriterConfig.config
    <?xml version="1.0"?>
    <RewriterConfig>
        <Rules>
            <RewriterRule>
                <LookFor>floor</LookFor>
                <SendTo>index_floor.html</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>door</LookFor>
                <SendTo>about/index_292.html</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>kolani</LookFor>
                <SendTo>index_kolani.html</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>nature</LookFor>
                <SendTo>index_nature.html</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>mobile</LookFor>
                <SendTo>index_mobile.html</SendTo>
            </RewriterRule>
        </Rules>
    </RewriterConfig>
    3.在webconfig里注册HttpModule;注意有2个地方需要处理
    集成模式下:
    <system.webServer>
        <modules>
            <!--Url重写-->
             <add name="UrlRewriteModule" type="UrlRewriteModule" />
    经典模式:在config/HttpModules.config里
    <httpModules
        <!--Url重写-->
        <add name="UrlRewriteModule" type="UrlRewriteModule" />

    4.如果是无后缀路径,比如/news,IIS6时需在IIS上增加通配符配置;


    实际使用过程中,可能需要您的匹配规则进行相应的修改,代码仅供参考。


     




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/4687656.html
Copyright © 2011-2022 走看看