ASP.NET 自定义URL重写

一.功能说明:
可以解决类似 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上增加通配符配置;



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


 


时间: 2024-10-30 09:16:42

ASP.NET 自定义URL重写的相关文章

Asp.net实现URL重写

原文:Asp.net实现URL重写 [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力:而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接:它还可以提高你的网站的安全性:而且通常会让你的网站更加便于使用和更专业. [过程]   [方法] 1.在asp.net请求管道中重写路径 2.通过组件,如微软的UrlRewriter.d

关于asp.net下Url重写问题?

问题描述 1.你好,请问一下,asp.net下RewritePath是否只能进行aspx网页的重写,比如,一个站点(http://jd.abc.com)要被写为http://jd.abc.com/fff/index.asp,行不?,其中fff这是一个目录,它放了一下小的asp网站?行吗?2.在写Url重写过程中,请问有什么方法能直接对请求(HttpApplication.Request.Url属性进行重写,赋给新的值,达到当IIS在处理请求前将请求包中的Url改变成想要的Url?谢谢. 解决方案

ASP.NET 中URl重写后原google收录的网页处理的问题

问题描述 我有2个问题请教1.ASP.NET中URl重写后原google收录的网页处理的问题我现在想URL静态化,用了IIRF(Ionic'sIsapiRewriteFilter)做网页重定向在IsapiRewrite4.ini文件中#重写/b-100.html到/Books/Content.aspx?ResourceID=100RewriteRule^/b-100.html$/Books/Content.aspx?ResourceID=100[U,L]现在为了保留google中保留的/Book

ASP.net的URL重写

asp.net ASP.net的RUL重写 有关于URL的重写,本文也只是拿来主意.相继有MS的组件"URLRewriter"和在Global.asax里的"Application_BeginRequest()"编码方式,以及IIS里的ISAPI设置. 娜列下来,实现方法也都很简单. 方法一:MS组件 这里也不用详解了,相关请看: http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLR

asp.net用url重写URLReWriter实现任意二级域名 高级篇_实用技巧

 我最近写了个小例子,大家可以先看这个,里面有小例子的完整代码下载 http://www.jb51.net/article/20906.htm 好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题.很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了?第一步:在浏览器键入了一个地址,比如h

asp.net用url重写URLReWriter实现任意二级域名 新_实用技巧

一般用百度搜的朋友都是对这个不了解但又急需要用的,我想,再多的语言也比不过一句代码.于是我把今天帮朋友时候写的一个小例子传了上来.这个小例子的目的是实现对任意url的重写(但不包括二级域名的,有需要二级域名的也可以先了解下url重写的概念). 这个小项目的制作过程如下 1.需要对诸如http://jb51.net/viewnews/2009/3/2.html的url进行重写.将其重写为http://jb51.net/viewnews.aspx?id=2&year=2009&month=3

asp.net用url重写URLReWriter实现任意二级域名第1/2页_实用技巧

好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题. 很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了? 第一步:在浏览器键入了一个地址,比如http://love.kerry.com,点回车后,都发生了什么? 为了把问题简单化,我来这样解释: 第二步:首先,键入的地址被解析,最终来

asp.net用url重写URLReWriter实现任意二级域名

好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题. 很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了? 第一步:在浏览器键入了一个地址,比如http://www.bianceng.cn,点回车后,都发生了什么? 为了把问题简单化,我来这样解释: 第二步:首先,键入的地址被解析,最终

基于asp.net MyHttpModule url重写方法

 代码如下 复制代码 using System; using System.Collections.Generic; using System.Web; using System.IO; using System.Text; namespace MyClass { public class MyHttpModule : IHttpModule { #region IHttpModule 成员 ///<summary> /// 释放所有资源 ///</summary> public