zoukankan      html  css  js  c++  java
  • url重写专题

    静态页htm传参数

    /从转向过来的URL中截取参数 开始
    function SplitUrl(key)
    {
     var fstr=key;
     var getstr='';
    var url=document.URL.toString();
     url=url.toLowerCase();//
    转为小写
     var loc=url.indexOf(fstr);
     if(loc>0)
     {
      getstr=url.substring(loc+fstr.length,url.length);
      return getstr;
     }
     else
     {
       return "";
     }
    }
    //
    从转向过来的URL中截取参数 结束

     HttpHandHttpModule的详细解释,包括Asp.NetHttp请求的处理流程。

    了解当用户对一个.aspx页面提出请求时,后台的Web服务器的动作流程。当对这个流程了解后,我们就会明白HttpHandlerHttpModule的作用了。

    首先,来了解一下IIS系统。它是一个程序,负责对网站的内容进行管理,以及对客户的请求(就是Http请求)做出反应。当用户对一个页面提出请求时,IIS做如下反应(忽略权限):
    1.
    把对方请求的虚拟路径转换成物理路径
    2.
    根据物理路径搜索请求的文件
    3.
    找到文件后,获取文件的内容
    4.
    生成Http头信息。
      PS
    :关于IISIE生成的Http头信息(元数据),可以用这个工具:http://www.blunck.info/iehttpheaders.html,它是IE的一个插件,专门查看头信息的。
    5.
    向客户端发送所有的文件内容:首先是头信息,然后是Html内容,最后是其它文件的内容。
    6.
    客户端IE浏览器获得信息后,解析文件内容,找出其中的引用文件,如.js .css .gif等,向IIS请求这些文件。
    7.IIS
    获取请求后,发送文件内容。
    8.
    当浏览器获取所有内容后,生成内容界面,客户就看到图像/文本/其它内容了。

    但是IIS有个缺点,即它仅仅支持静态html页面的内容,就是说,他只能分析如.htm.html这样的文件内容。像一些动态内容的页面,含有服务器端操作代码的页面类型,如.asp.aspx.cgi.php等,IIS不认识这些专用的标记,它就会把它当作文本,丝毫不做处理发送到客户端。

    为了解决这个问题。IIS推出了一种机制,叫做ISAPI的开放扩展,这个东西是一个标准组件(COM组件),他是一个过滤器+跳转程序,如果安装了专门的扩展,那么在访问IIS所不能处理的文件时,如.asp.aspx文件,IIS就会在自己的进程里面启动这个扩展。刚才说了,ISAPI首先是个过滤器,他在注册到IIS的时候,会把每个扩展可以处理的文件扩展名注册到IIS里面。扩展启动后,就根据定义好的方式来处理IIS所不能处理的文件,然后把控制权跳转到专门处理代码的进程中。让这个进程开始处理代码,生成标准的HTML代码,生成后把这些代码加入到原有的Html中,最后把完整的Html返回给IISIIS再把内容发送到客户端。

    我拿一个请求asp.net页面的执行步骤说明:
    1
    客户端IE浏览器通过Http协议向一个Web服务器提出请求,如
      http://www.microsoft.com/china/msdn/default.mspx

    2 当请求到达时,IIS 检查资源类型(就是检查请求文件的扩展名,发现不是自己所能处理的),就调用 ASP.NET ISAPI 扩展。如果启用了默认的进程模型,aspnet_isapi 会将请求排队,并将请求分配给辅助进程。所有的请求数据都通过异步 I/O 发送。如果启用了 IIS 6 进程模型,请求将自动在辅助进程 (w3wp.exe) 中排队,此辅助进程用于处理应用程序所属的 IIS 应用程序池。IIS 6 辅助进程不了解 ASP.NET 和托管代码的任何情况,它只是处理 *.aspx 扩展并加载 aspnet_isapi 模块。当 ASP.NET ISAPI IIS 6 进程模型中运行时,它的工作方式有所不同,仅在 w3wp.exe 辅助进程的上下文中加载 CLR

    3 收到请求后,ASP.NET 辅助进程将通知 ASP.NET ISAPI,它将为请求服务。通知通过同步 I/O 实现。之所以使用同步模型,是因为请求只有在 ISAPI 内部请求表中被标记为“executing”,辅助进程才能开始处理它。如果请求已经由特殊的辅助进程进行处理,则不能再将它指定到其他进程,除非原始进程已取消。

    4 完成后,响应被发送到打开了异步管道的 aspnet_isapi。现在,请求的状态变为“Done”,之后将从请求表中被删除。如果辅助进程崩溃,正在处理的所有请求仍将保持“executing”状态并持续一段时间。如果 aspnet_isapi 检测到辅助进程已取消,它将自动终止请求并释放所有相关的 IIS 资源。

    5 最后,ISAPI获取了响应(就是经过asp.net运行库所处理后的html内容)后,把响应返回给IISIIS将继续处理它的内容,解析所需相关文件,并且把所有的数据发送给客户端。然后关闭连接。


    从上面的叙述可以知道,最终要的步骤是Asp.net处理的那一段过程,就是当asp.netISAPI启动处理进程后发生了什么事

    虚拟主机上用Asp.net实现Urlrewrite

    在网上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandleServer.Transfer的方法。其实这种方法是错误的。第一,HttpHandle是实现不了urlrewrite的;第二Server.Transfer是标准的重定向,根本不是urlrewrite

    其实,实现urlrewrite不用自己HttpHandle,也不用自己实现HttpModule,用几行代码就可以轻松实现。

    我这里介绍的是在虚拟主机上,虚拟主机不同于自己的服务器,你是没有权限去修改IIS,也没有权限去安装iis rewrite之类的IIS插件。但是我们仍然可以轻松完成需要的功能。

    具体做法如下:打开global.asax.cs,定位到protected void Application_BeginRequest(Object sender, EventArgs e)。从方法名我想也能猜到它是做什么的。输入如下代码:

     

    protected void Application_BeginRequest(Object sender, EventArgs e)

    {

       string oldUrl = HttpContext.Current.Request.RawUrl ;

     

       string pattern = @"^(.+)default/(\d+)\.aspx(\?.*)*___FCKpd___0quot;;

       string replace = "$1default.aspx?id=$2";

     

       if(Regex.IsMatch(oldUrl, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))

       {

            string newUrl = Regex.Replace(oldUrl, pattern, replace, RegexOptions.Compiled |

    RegexOptions.IgnoreCase);

            this.Context.RewritePath(newUrl);

       }

    }


    有了上边这段代码,我访问一个类似:.../default/123.aspx 的网址,当然这个网址在我的电脑上不存在,它就会被定向到:.../default.aspx?id=123

    当然,利用功能强大的正则表达式,你可以任意按照自己的需要来重写url,这一切都是在服务器端默默的进行,在客户端是不会有任何察觉的。由于是在虚拟主机上,我们只能重定向.aspx文件,如果是自己的服务器,只要把后缀名在IIS中注册一下,就可以实现任意后缀名的处理。比如你可以注册一个*.myweb这样的类型,这样别人访问default/456.myweb时,你可以把它重定向到default.aspx?id=456。总之一句话,只要你能想到.net就可以帮你实现,并且这一切不需要多少的代码。

    ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI

    URL重写已经有很多的方法,但是多数都有一个缺点,就是不支持无扩展名的网页。微软提供的方法需要在根目录里面建立jyk的文件夹,然后再建立一个default.aspx的文件,如果您有100名会员的话,这是一个不可想象的事情。

    另一个方法就是使用ISAPI过滤器,但是这个一般需要在服务器上安装一个DLL文件,自己没有服务器就不好办了。

    下面提供一个可以说是我发明的一个方法——不知道以前有没有人想到过——利用两个特性来实现。

    第一个:IIS里面的找不到文件的错误设置。

    第二个:asp.net 里面的Server.Transfer("topic.aspx?id=jyk");

    这两个结合起来就可以达到我们的目的了。

    思路:利用404b错误捕捉客户的请求,再使用Server.Transfer转向。

    在我们访问http://www.aaa.com/jyk 的时候,假设这时服务器上没有jyk文件夹,那么会返回什么结果呢?会返回一个无法找到该页的页面,那么这个返回结果能不能自己控制一下呢?很幸运IIS提供了这个功能,我们可以把这样的错误指定到网站里的一个页面。

    操作步骤:

    第一步:打开IIS管理器,网站属性——自定义错误标签——404错误——点击修改——修改消息类型“URL”,在下面的文本框里填写处理这个错误得页面名称,比如/none.aspx

    第二步:在我们的网站根目录下建立一个none.aspx的网页。在里面随意写点内容(测试用)。

    设置完毕,这时再访问http://www.aaa.com/jyk,显示的就是 none.aspx的网页内容了。注意这时浏览器里面的URL地址仍然是http://www.aaa.com/jyk,而不是http://www.aaa.com/none.aspx 。这一点很重要,如果地址变了,那就没有意义了。

    那么我们怎么把页面转到我们希望的页面呢,这时所有的找不到文件的情况都会转到none.aspx文件,显然这不是我们想要的最终结果。那么我们怎么获取客户输入的网址呢?

    打开none.aspx的后台文件,

    string URL = Request.Url.Query;

    我们可以使用上面的语句来获取URL地址,得到的地址格式是:

    ?404http://www.aaa.com/jyk

    其中 “?404”是固定的,过滤掉它就是浏览器里面的URL地址了。

    剩下的事情就是根据情况来转换网页了。可以拆串,再用switch来判断;也可以用正则表达式来判断。因为我正则不熟,我采用的是switch的方式。正则表达式请参考其他的资料,我也在找,如果您找到了请共享一下,谢谢。

    优点:

    1 支持无扩展名的网页。不用建立文件夹和文件。

    2 思路简单,用法也很简单,代码也不复杂,不涉及高深的理论;

    3 支持搜索引擎,就是说可以被各大搜索引擎搜录。

    4 可以配合域名泛解析使用。

    缺点:

    1 需要修改一下IIS 404b错误的处理方法;

    2 效率要略微低一点。

    3 如果您只使用.aspx的扩展名的话就可以不用修改IIS了。

    4 Asp不支持。因为aspServer.Transfer不能带参数(?id=jyk),不能传递参数的重写几乎没有什么意义。

    用好ASP.NET 2.0URL映射

    简介:

      URL映射是ASP.NET 2.0中提供的新特性。URL映射技术帮助我们将一个特定URL映射为另一个URL。为了帮助理解,我们假设你在站点有一个叫Homepage.aspx的页面来访问主页,所有的用户也都用这个页面来访问你的主页。但由于某些原因,你要将主页改为OriginalHome.aspx。此时使用URL映射让你可以映射到新页面,而不必通知用户。

      如果我们设置了URL映射,那么任何用户在URL栏输入Homepage.aspx时,调用的都是OriginalHome.aspx

      深入概念:

      让我们看看如何实现它。

      这可以在configuration部分实现。

      语法:

    urlMappings enabled="[true|false]"
    add url="String"
    mappedUrl="String"/

    /urlMappings

      如果你想使用URL映射,你必须将enabled属性设置为true。每个add元素都含有一个原URL和映射URL。对,概念很简单!如果我们为上述场景配置了URL映射,config文件中的元素显示如下:

    urlMappings enabled="true"
    add url="~/ Homepage.aspx" mappedUrl="~/ OriginalHome.aspx"/
    /urlMappings

      一旦我们进行了修改或在工程的web.config文件中增加了如上的元素,任何用户试图访问Homepage.aspx时,由于URL映射,都将调用OriginalHome.aspx页面。有趣的是在URL栏中仍然仅显示Homepage.aspx。所以尽管想到内部调用/执行了OriginalHome.aspx,用户在URL栏仍见到Hopepage.aspx

      一些优点:

      1.若你的客户标记了到一个页面的链接,但你又得删除该页并在换上其他页面,那么使用URL映射你可以解决这个商业问题而不用让客户知道这个页面变化。

      2.若有一个大而复杂的URL,但不想把它给用户,那么你可以告知简单的URL,而自己将简单的URL映射到原先的URL

      3. 用这个方法可以方便处理菜单控件。最好的例子就是asp.net站点。

      4.这里也牵涉到安全(用户无法在URL栏看到真实的页面名,这也是一种加密!)。

      希望你喜欢这个新特性。

      是的,我知道,现在你的问题是,既然现在ASP.NET 2.0还没有面市,怎么利用这个新特性呢。这里有个变通方法。Stev在他的blog里进行了简要的解释。

      你可以在http://weblogs.asp.net/ssmith/archive/2003/11/06/36191.aspx看到。他的解释非常简单,根据你的实际案例,你可以为它增加功能。

      现在你可以使用这个技巧,而等ASP.NET 2.0面市,你就可以利用新特性了。

  • 相关阅读:
    从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧
    七牛云助你度寒冬 | 每天 10:24, 新用户抢全额免单
    (下)挖掘传统行业日志大数据的无限价值
    (上)挖掘传统行业日志大数据的无限价值
    8.27 直播| 挖掘传统行业日志大数据的无限价值
    千亿级数量下日志分析系统的技术架构选型
    七牛云工程效率部测试服务如何为 70 万+ 客户保驾护航?
    云计算的新墨菲定律
    如何建设高吞吐量的日志平台
    新一代智能视频云发展现状分析:五大要素成关键
  • 原文地址:https://www.cnblogs.com/shihao/p/1537583.html
Copyright © 2011-2022 走看看