当前位置:  编程技术>.net/c#/asp.net

使用http module 对url进行重写的方法

    来源: 互联网  发布时间:2014-08-30

    本文导语:      本文为大家介绍 使用http module 对url进行重写的方法尝试,感兴趣的朋友可以参考下。   要将两个独立的站点(假设为dh.site.com和cd.site.com)放到同一个站点的两个application下,分别为(www.site.com/dh和www.site.com/cd)。   因为在...

    本文为大家介绍 使用http module 对url进行重写的方法尝试,感兴趣的朋友可以参考下。

  要将两个独立的站点(假设为dh.site.com和cd.site.com)放到同一个站点的两个application下,分别为(www.site.com/dh和www.site.com/cd)。

  因为在开发时,大部分静态文件的引用路径都是采用绝对路径的形式,例如/style/css1.css。可想而知,当将两个站点作为两个application放置后,这些静态文件就变得无法访问了,因为文件真实的路径已经变成了/dh/style.css1.css了。解决这个问题的最直接的方法就是修改所有的绝对路径:要么将原来的路径加上application的虚拟根路径(例如将/style.css1.css变成/dh/style.css1.css),要么改成相对路径。但无论如何,直接修改路径的方式都要找出散布在各个角落里的路径查找出来,再进行修改。虽然利用IDE的查找替换功能可以很快将路径查找出来,但也难免查找不完全,另一方面,如果路径数量非常多,则不得不花费大量时间去修改并且在修改后进行检查排错。

  尝试一:使用http module进行路径重写。

   这也是非常直接地联想到的方法:使用http module(可以使用url rewriter,或者自己编写一个http module)对正在进行访问的url进行重写到正确的路径。但这使用http module进行重写会有一个问题:只能用作重写静态文件请求,而对于aspx之类的动态文件的请求,因为在IIS6或以上,不同应用程序运行在不同的应用程序域(app domain)中,因此对动态文件的请求进行重写转跳,会发现两个转跳对象的session根本不同,或者根本不能加载类型(root application可以加载子application的类型)。这无论从网站安全角度,还是程序都安全角度来说,都是合理的。

  因为这里需要自定义更多的东西,因此需要自己编写一个http module,而不是使用url rewriter。思路如下:因为cd和dh中的静态文件都是指向到虚拟根目录的,因此需要在站点的root application中使用该http module。而在http module中,根据静态文件请求的referrer来判断请求时来自dh还是cd,然后再重定向到dh或者cd下相对应的文件。

http module中的代码:
 

代码如下:

public class RedirectModule : IHttpModule
    {
        //定义静态文件的扩展名数组
        static string[] staticsFilesExName=new string[]{".jpg",".jepg",".gif",".png",".css",".html",".js"};
        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            if (app.Context.Request.UrlReferrer != null)
            {
                //取得页面的referrer,进行判断请求是来自www.site.com/dh还是来自www.site.com/cd
                string referrer = app.Context.Request.UrlReferrer.AbsoluteUri;

                //取得application root path部分,也就是http://www.site.com/dh中的"/dh"部分
                string appRootPath = referrer.Substring(23, 3);

                string rawUrl = app.Request.RawUrl;
                //得到转跳的url
                string reUrl = appRootPath + rawUrl;

                string extendName = app.Request.Path.Substring(app.Request.Path.LastIndexOf("."));

                //判断请求的对象是否为静态文件,是则转跳。
                if (RedirectModule.staticsFilesExName.Contains(extendName.ToLower()))
                {
                    app.Context.RewritePath(reUrl);
                }
            }
        }

        public void Dispose()
        {
           
        }
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }
    }

  注意:在IIS7.5中,为了能使http module正常工作,除了在web.config/httpModules节下添加http module外,必须将站点的应用程序池版本.net framework版本设置为V2.0,并且将托管管道模式设置经典(classic),此外,还可能需要在system.webServer/handlers节中添加配置:

   然而,虽然使用http module能解决静态文件访问的问题,但不能重写动态文件,所以这不是个完美的解决方案。当然,如果动态文件的url数量少,手动改起来工作也不大的话,这也是个可以接受的方法。

  另外,可以考虑一下使用isapi filter来实现请求url重写,而且因为不同于http module要受到.net的限制,isapi filter运行在IIS层次之中,是否能突破应用程序池的限制,重定向的文件能顺利被执行(就如同该请求事来自浏览器一样)?


    
 
 

您可能感兴趣的文章:

  • MBR被重写了,使用网上所说的命令怎么出错呢?
  • asp.net使用URLRewriter.dll进行重写的方法举例
  • thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
  • linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
  • 我安装Samba 3.0.4,能够使用smbclient进行登陆,可是不能使用windowsXP进行登陆
  • 消息队列一般是怎么使用的,是采用While的方式进行轮询么
  • linux中使用sort命令进行排序的问题
  • 只使用InputStream/OutputStream进行IO操作行吗?
  • 菜鸟问题,小弟刚刚使用LINUX不久,不知道如何使用编程工具进行编译和运行!
  • 下载的linxu如何使用md5文件进行验证?
  • 使用jdk1.4+wstk3.2+tomcat+axis进行开发webservice
  • linux下动态库中如何导出对象进行使用
  • 有谁告诉我如何使用main中的args进行输入输出的操作?
  • 针对使用java进行硬件编程
  • linux 下两个硬盘进行复制,用DD该如何使用????
  • 使用Linux/UNIX的系统用户进行PHP用户登录验证
  • 如何使用gdb+gdbserver进行调试
  • jquery代码-如何使用多个属性来进行过滤
  • 在Linux下怎么使用pppoe进行拨号?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 如何使用shell脚本实现fdisk /dev/sdb的自动分区,不与用户进行交互
  • sql使用cast进行数据类型转换示例
  • jsp 中如何使用word进行编辑?
  • 在linux操作系统中如何对打印机,扫描仪使用的次数进行审计
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在div中使用css让文字底部对齐的方法
  • 弱智问题:我们怎么才知道要使用的方法需要实现什么接口才能使用这个方法呢?
  • linux下c/c++使用hash_map方法介绍
  • JAVA中不赞成使用(Deprecated)的方法是否可以使用
  • ftp协议介绍及ftp常用的上传下载等操作命令使用方法
  • c#中SAPI使用总结——SpVoice的使用方法
  • 有没有方法在 非solaris 的 unix下,比如说 sco unix 下面,使用 j2se 的方法!
  • 我初学NETTERM的使用,在哪里可以找到所有(或常用的)命令的使用方法呢?还是需要在什么书上可以找到?
  • 类的方法和实例方法,类字段和实例字段有什么不同,在使用上?
  • 用JDBC-ODBC访问ACCESS,能不能用ResultSet的deleteRow()方法?我怎么用的不行?另外,我在使用CachedRowSet类时,当调用acceptChange()方法时
  • 使用DateTime的ParseExact方法实现特殊日期时间的方法详解
  • jquery链式操作的正确使用方法
  • 关于telnet xxx.xxx.xxx.xxx:80的使用方法问题
  • jquery append()方法与html()方法的区别及使用介绍
  • 我用的是红帽5 我想知道我LINUX下的KDbg的使用方法
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • Javascript里的两种使用正则的方法
  • Linux 下监控某进程 内存使用峰值的方法?
  • 使用jquery prev()方法找到同级的前一个元素
  • byte() 方法如何使用?
  • :)```一个初级问题抽象类的方法我怎么使用?!!
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3