一.功能说明:

可以解决类似 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 174人阅读 评论(0) 收藏的更多相关文章

  1. ASP.NET 自定义URL重写 分类: ASP.NET 2014-10-31 16:05 175人阅读 评论(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. VB中 ByRef与ByVal区别

    函数调用的参数传递有"值传递"和"引用传递"两种传递方式.如果采用"值传递",在函数内部改变了参数的值,主调程序的对应变量的值不会改变:如果 ...

  2. bootstrap框架-----可见 隐藏

    可见框架-像素选择 -block-inline  :块内联元素 -inline-block将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格 可以设置宽度和 ...

  3. git分支的合并

    原文: http://gitbook.liuhui998.com/3_3.html http://gitbook.liuhui998.com/5_3.html 一.如何分支的合并 在git中,可以使用 ...

  4. oracle数据库迁移---windows环境下

    以前在学校只是听过oracle,但是从来没有接触过.最近公司突然给了我一个任务,让我将某个大型商场的网站迁移到与服务器上面. 当时也觉得,迁移个网站也就是个很简单的事情,将文件复制,拷贝下就可以了撒. ...

  5. shell变量判空几种方法

    强烈声明:关于对数字的比较以及判断是否为空 最好在外层添加""引起来,这样可以避免空与其他字符比较时报错的问题. 1. 变量通过" "引号引起来 #!/bin/ ...

  6. Divide and conquer:Median(POJ 3579)

        快速求两数距离的中值 题目大意:给你一个很大的数组,要你求两个数之间的距离的中值 二分法常规题,一个pos位就搞定的事情 #include <iostream> #include ...

  7. WP8 双击返回键退出

    bool isExit = false; // 构造函数 public MainPage() { InitializeComponent(); isExit = false; // 用于本地化 App ...

  8. java中的[Ljava.lang.Object;@2a139a55问题

    数据显示为Ljava.lang.Object;@2a139a55问题,是因为你从数据库读出数据后,存入到list集合上时,如果你没有指定要存入的数据的类型,系统会自动给你赋一个object类型,他是所 ...

  9. sehll_if

    -s file 文件大小非0时为真 [ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可 ...

  10. sshd_conf AllowUsers参数

    AllowUsers root user1 user2 #服务器只允许root user1 user2登录,再的新也用户产生,是不允许豋录服务器 配置文件在/etc/ssh/sshd_confing ...