`
bcyy
  • 浏览: 1831074 次
文章分类
社区版块
存档分类
最新评论

URL重写 时遇到的问题

 
阅读更多

使用微软提供的url重写组件urlrewirter可以很轻松的实现URL重写,方法简单如下:

  1. 下载urlwriter组件:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx,将该组件方到web application的bin文件夹下。
  2. 配置web.config文件:
    <?xmlversion="1.0"encoding="utf-8"?>
    <configuration>
    <configSections>
    <sectionname="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter"/>
    </configSections>
    <RewriterConfig>
    <Rules>
    <RewriterRule>
    <LookFor>~/d(d+).aspx</LookFor>
    <SendTo>~/default.aspx?id=$1</SendTo>
    </RewriterRule>
    </Rules>
    </RewriterConfig>
    <system.web>
    <httpHandlers>
    <addverb="*"path="*.aspx"type="URLRewriter.RewriterFactoryHandler,URLRewriter"/>
    </httpHandlers>
    </system.web>
    </configuration>

其中<sectionname="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter"/>
是表示config文件中配置节RewriterConfig的处理程序URLRewriter.Config.RewriterConfigSerializerSectionHandler,该处理程序在程序集URLRewriter中.配置节UrlRewriterConfig配置节就是请求的URL和实际URL的映射,且支持正则表达式,使用更方便。

但是会遇到这样的问题:当你请求一个URL(如:http://localhost/guangboo/d23.aspx)时,会被重放到http://localhost/guangboo/default.aspx?id=23 去,但是在该页面点击某一按钮或触发回发事件时候,页面就会被回发到http://localhost/guangboo/default.aspx?id=23 页面,这样实际的URL还是被暴露了,就失去了URL重写的意义了,当我们用记事本打开查看http://localhost/guangboo/d23.aspx页面时,我们会发现,form的action属性是default.aspx,这就是原因所在,网上有这样两种方法可以解决这样的问题,也都是从form 的action属性为出发点的:

1,自己定义一个Actionlessform类,在aspx中不再使用系统提供的form标记

namespaceActionlessForm
...{
publicclassForm:System.Web.UI.HtmlControls.HtmlForm
...{
protectedoverridevoidRenderAttributes(HtmlTextWriterwriter)
...{
writer.WriteAttribute(
"name",this.Name);
base.Attributes.Remove("name");
writer.WriteAttribute(
"method",this.Method);
base.Attributes.Remove("method");
this.Attributes.Render(writer);
base.Attributes.Remove("action");
if(base.ID!=null)
writer.WriteAttribute(
"id",base.ClientID);
}

}

}

做用法法是在ASP.NET网页的顶部添加以下内容: <%@RegisterTagPrefix="skm"Namespace="ActionlessForm"Assembly="ActionlessForm"%> 然后,<formrunat="server">(如果有)替换为:<skm:Formid="Form1"method="post"runat="server">
并将右边的</form>标记替换为:</skm:Form>

(2)第二种方法就是继承page,这样你不需要在aspx页中改任何东西。
代码

publicclassOLPage:Page...{
publicOLPage()...{}
protectedoverridevoidRender(HtmlTextWriterwriter)...{
if(writerisSystem.Web.UI.Html32TextWriter)...{
writer
=newFormFixerHtml32TextWriter(writer.InnerWriter);
}
else...{
writer
=newFormFixerHtmlTextWriter(writer.InnerWriter);
}

base.Render(writer);
}

}


internalclassFormFixerHtml32TextWriter:System.Web.UI.Html32TextWriter...{
privatestring_url;//假的URL
internalFormFixerHtml32TextWriter(TextWriterwriter)
:
base(writer)...{
_url
=HttpContext.Current.Request.RawUrl;
}

publicoverridevoidWriteAttribute(stringname,stringvalue,boolencode)...{
if(_url!=null&&string.Compare(name,"action",true)==0)...{
value
=_url;
}

base.WriteAttribute(name,value,encode);
}

}

internalclassFormFixerHtmlTextWriter:System.Web.UI.HtmlTextWriter...{
privatestring_url;
internalFormFixerHtmlTextWriter(TextWriterwriter)
:
base(writer)...{
_url
=HttpContext.Current.Request.RawUrl;
}

publicoverridevoidWriteAttribute(stringname,stringvalue,boolencode)...{
if(_url!=null&&string.Compare(name,"action",true)==0)...{
value
=_url;
}

base.WriteAttribute(name,value,encode);
}

}

然后把项目中的所有aspx文件对应的cs文件中的继承page类的代码改写为继承OLPage。
例如
publicclassWebForm1:page
改写为
publicclassWebForm1:OLPage即可。

但是,我想用http://localhost/guangboo/?a=23 重写到http://localhost/guangboo/Article.aspx?cc=23 的时候又出现问题了,如果用上面的方法来实现这个的话,当在http://localhost/guangboo/?a=23页面产生回发事件时,就会重发到http://localhost/guangboo/default.aspx?a=23;因为默认/?代表了/default.aspx?就是请求http://locahost/guangboo/ 时候就是请求http://localhost/guangboo/default.aspx 一样。同样用记事本打开http://localhost/guangboo/?a=23可以看到form 的action属性是default.aspx?a=23,只要对上面的OLPage 类稍加修改就可以到目的了,即将OLPage类中的HttpContext.Current.Request.RawUrl改为HttpContext.Current.Request.RawUrl.Replace("default.aspx","");即可。也就是把action中的default.aspx去掉。

改好后,运行又来了一个问题,网页什么内容都没了,除了EnableViewState="true"的控件内容外。将控件的EnableViewState属性设为true ,OK!

注意:我们知道EnableViewState属性用用来保存控件的信息的,在HTML文件中表现为一个<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTIwMDIzMDY0MjcPZBYCZg9kFgICAw9kFgYCBQ8WAh4LX......"/>的隐藏元素,EnableViewState会使页面的大小膨胀很多。因此期待更好的方法。

分享到:
评论

相关推荐

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中可能遇到的陷阱及处理办法。 需要手动为UrlRewriteWebSite目录添加一个到...

    struts2中实现URL重写

    最近开发项目的时候,遇到Struts2需要URL重写的问题,总结了下资料,和大家分享!!

    asp.net url重写后页面回传问题

    最近在做项目时遇到了URL重写后当页面回传时,url又刷回原值;这个问题困扰了很久,终于找到解决办法了。

    详解IIS中的重写工具下关于操作重定向URL中的{R:N}与{C:N}使用介绍

    但是其相关的中文资料比较缺少,官方倒是有完整和详细的英文文档,之前我在项目中遇到需要设置重写/重定向URL操作规则时,对于范例中的{R:N}和{C:N}规则就理解的十分辛苦,因此写下本文分享下经验。 这里先附上官网...

    iis7下url重写后已存在的html不能访问了的解决方法

    本文为大家详细介绍下iis7下url重写后,原本存在的html不能访问了,未能执行URL(asp.net对真正的.html(但不符合重写规的)就不知道如何处理了),遇到类似情况的朋友可以参考下

    九头鸭分页控件 Url分页方式

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉DataPage控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 8、DataPage分页效率高效除了默认实例access外如果选择sql...

    九头鸭.net分页控件 v1.1.rar

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉DataPage控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 8、DataPage分页效率高效除了默认实例access外如果选择sql...

    九头鸭.net分页控件DataPage.rar

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉DataPage控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 8、DataPage分页效率高效除了默认实例access外如果选择sql...

    能用漂亮分页控件及Demo源码

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉AspNetPager控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 Demo的主要功能有: 基本功能 分页按钮属性效果 使用...

    AspNetPager

    1、支持通过Url进行分页: AspNetPager除提供默认的类似...控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉AspNetPager控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。

    ASP.NET 各种分页技巧

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉AspNetPager控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 Demo的主要功能有: 基本功能 分页按钮属性效果 使用...

    九头鸭分页控件源码

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉DataPage控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 8、DataPage分页效率高效除了默认实例access外如果选择sql...

    AspNetPager控件及Demo源码 v7.02

    2、支持Url分页方式下的Url重写(UrlRewrite)功能 Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面...

    AspNetPagerv7.4.1分页控件及Demo源码2012919

    Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, AspNetPager支持Url重写技术使您可以自定义分页导航的Url...

    AspNetPager示例源码

    控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉AspNetPager控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 AspNetPager72Src下为AspNetPager组件源码

    ASP.Net皮肤换肤控件

    2、支持Url分页方式下的Url重写(UrlRewrite)功能 Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, ...

    AspNetPager控件及Demo源码 v7.4.4.rar

    Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, AspNetPager支持Url重写技术使您可以自定义分页导航的Url...

    AspNetPager示例源码学习 7.2

    Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, AspNetPager支持Url重写技术使您可以自定义分页导航的Url...

    Android实现简易浏览器遇到问题的解决方法

    最近没事写了一个简易浏览器,在刚开始写的时候遇到一些问题,主要的问题就是如何在自己的webview中显示所有的网页数据,不过不指定自己的webview显示所有网页数据则会调用系统默认的webview来加载数据,所以解决的...

    AspNetPager7.2分页控件及Demo源码

    Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, AspNetPager支持Url重写技术使您可以自定义分页导航的Url...

Global site tag (gtag.js) - Google Analytics