一.功能说明:

可以解决类似 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上增加通配符配置;




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



 





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

ASP.NET 自定义URL重写 分类: ASP.NET 2014-10-31 16:05 175人阅读 评论(0) 收藏的更多相关文章

  1. ASP.NET 自定义URL重写 分类: ASP.NET 2014-10-31 16:05 174人阅读 评论(0) 收藏

    一.功能说明: 可以解决类似 http://****/news 情形,Url路径支持正则匹配. 二.操作步骤: 1.增加URL重写模块: using System; using System.IO; ...

  2. window.onload,<body onload="function()">, document.onreadystatechange, httpRequest.onreadystatechang 分类: C1_HTML/JS/JQUERY 2014-08-06 16:47 558人阅读 评论(0) 收藏

    部分内容参考:http://www.aspbc.com/tech/showtech.asp?id=1256 在开发的过程中,经常使用window.onload和body onload两种,很少使用do ...

  3. Mahout快速入门教程 分类: B10_计算机基础 2015-03-07 16:20 508人阅读 评论(0) 收藏

    Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单 ...

  4. Improving the GPA 分类: 贪心 HDU 比赛 2015-08-08 16:12 11人阅读 评论(0) 收藏

    Improving the GPA Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...

  5. Task schedule 分类: 比赛 HDU 查找 2015-08-08 16:00 2人阅读 评论(0) 收藏

    Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. android开发之broadcast学习笔记 分类: android 学习笔记 2015-07-19 16:33 32人阅读 评论(0) 收藏

    android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...

  7. android开发之this.finish()的使用 分类: android 学习笔记 2015-07-18 19:05 30人阅读 评论(0) 收藏

    在一个Activity用完之后应该将之finish掉,但是,之前在学校里自己摸索着开发时并没有太注意这个问题,因为activity无论是否finish掉对功能的影响貌似都不是那么明显(这是读书时候的观 ...

  8. AndroidManifest.xml中的application中的name属性 分类: android 学习笔记 2015-07-17 16:51 116人阅读 评论(0) 收藏

    被这个不起眼的属性折磨了一天,终于解决了. 由于项目需要,要合并两个android应用,于是拷代码,拷布局文件,拷values,所有的都搞定之后程序还是频频崩溃,一直没有找到原因,学android时间 ...

  9. JavaScript概念之screen/client/offset/scroll/inner/avail的width/left 分类: JavaScript HTML+CSS 2015-05-27 16:42 635人阅读 评论(0) 收藏

    原文地址:http://caibaojian.com/js-name.html JS中获取各种宽度和距离,常常让我们混淆,各种浏览器的不兼容让我们很头疼,现在就在说说js中有哪些宽度和距离. 1.名词 ...

随机推荐

  1. replace、replaceAll、replaceFirst的区别详解

    String s = "my.test.txt"; System.out.println(s.replace(".", "#")); Sys ...

  2. nginx配置多域名映射方法(本地hosts)

    本地测试网站的时候如果不想用localhost/xxxx的形式访问,可能就需要修改hosts文件来映射了,但是一个网站还好,假如有多个网站的话就不行了. 这时就需要配置多域名映射 比如hosts中配置 ...

  3. IntelliJ IDEA License

    http://jetbrains.tech/ http://jetbrains.tencent.click/

  4. 77 找出最大连续自然数个数[Longest Consecutive Sequence in an Unsorted Array]

    [本文链接] http://www.cnblogs.com/hellogiser/p/Longest-Consecutive-Sequence-in-an-Unsorted-Array.html [题 ...

  5. svn上传报Authorization failed错误解决办法

    svn上传文件时没有弹出用户登录界面,而是直接报Authorization failed错误.出现该问题基本都是三个配置文件的问题,下面把这个文件列出来 svnserve.conf配置文件中的 [ge ...

  6. perl的一些函数(二)

    1. tr 转换 转换不是替换(tr///==y///) tr/searchlist/replacementlist/用于查找某个一个字符串,并用replacementlist替换,可以使用正则表达式 ...

  7. 比较两个mysql数据库表结构的差异

    需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...

  8. LINUX查看系统日志

    cat tail -f 日 志 文 件 说    明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安 ...

  9. 【mysql】利用Navicat for MySQL的使用

    1. 查看sql语句 如果忘记了某个SQL语句怎么写,可以利用Navicat for MySQL的历史日志来查看 在Navicat for MySQL中,直接对数据库进行想要的操作,然后点击工具-&g ...

  10. Odoo误删除服务产品造成的错误解决办法

    在Odoo8.0中删除了产品中的服务,会造成工时单模块的安装失败,信息如下所示: ParseError: "null value in column "name" vio ...