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

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会使页面的大小膨胀很多。因此期待更好的方法。

分享到:
评论

相关推荐

    asp.net c# Url重写和无扩展名Url重写

    在实现无扩展名URL重写时,需要注意配置IIS或者Web.config文件,确保服务器知道如何处理这些不带扩展名的请求。通常,你需要设置一个默认的文档或者定义一个路由,让服务器知道这些URL实际上应该指向哪个处理程序。 ...

    URL重写URL重写URL重写

    在实际应用中,我们可能会遇到动态参数的处理、URL的301重定向、防止目录遍历攻击等问题。例如,可以通过以下规则将动态URL重写为静态形式: ```apacheconf RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f ...

    Windows IIS安装URL重写完整教程.rar

    本教程将详细阐述如何在Windows IIS上安装并配置URL重写组件,以及解决Vue项目在IIS上部署时可能遇到的问题。 首先,让我们了解URL重写的概念。URL重写允许我们根据预设的规则更改用户请求的实际URL,而服务器仍然...

    asp+asp.net1.1 URL重写

    7. **SEO问题**:虽然URL重写有利于SEO,但过度重写可能导致混乱。保持URL简洁明了,包含关键词,但不要过度堆砌。 8. **调试与日志**:在开发过程中,设置适当的日志记录和调试信息,以便在出现问题时追踪和修复。...

    URL重写DEMOURL重写DEMO

    在"URL重写DEMO"中,我们可能还会遇到如何处理查询字符串、如何处理路径中的参数、如何处理应用程序内部的路由等实际问题。开发者可能会创建不同的重写规则来处理不同类型的URL,确保每个请求都能被正确地重定向到...

    url重写组件,URLRewrite

    标题中的“URL重写组件,URLRewrite”指的是在Web开发中用于管理应用程序URL的一种技术。URL重写是将用户请求的实际URL(可能是复杂的查询字符串)转换为更友好的、可读性更强的URL,这在提升用户体验和SEO(搜索...

    开启win2003 IIS PHP URL重写_伪静态

    - 如果遇到问题,可以使用URL Rewrite Module中的诊断工具或查看日志来定位和解决问题。 通过以上步骤,你就能在Windows Server 2003的IIS环境中成功启用PHP的URL重写和伪静态功能。这将使你的网站更易于管理和...

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

    在ASP.NET环境中,URL重写是一个关键功能,它允许开发者隐藏实际的URL路径,提供更友好的用户体验,同时也能增强SEO(搜索引擎优化)。 **基本概念** 1. **二级域名**:二级域名是在主域名前添加的子域名,如 `love...

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

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

    JAVA URL重写

    ### JAVA URL重写知识点解析 #### 一、实验目的与背景 在进行Web开发时,服务器...对于开发者而言,在实际工作中遇到类似问题时,可以根据具体情况选择合适的会话跟踪机制,以保证Web应用程序的稳定性和用户体验。

    URL重写

    URL重写还有助于解决网站迁移、页面重命名或URL结构更改时的链接断链问题。通过重写旧URL到新URL,可以保持旧链接的可用性,避免用户和搜索引擎遇到404错误。 总的来说,`UrlRewrite_HttpModule1`可能是实现自定义...

    ThinkPHP的URL重写问题

    在使用ThinkPHP框架时,URL重写是一个常见的需求,它主要目的是为了使URL更加美观,隐藏实际的控制器和操作方法,提升用户体验。本篇文章将详细解释如何在Apache服务器上进行URL重写,以及解决ThinkPHP中相关的问题...

    ASP.NET的UrlRewrite URL重写伪静态实例

    ### ASP.NET中的URL重写(伪静态)技术详解 #### 一、引言 在网络世界里,用户常常遇到带有`.html`或`.aspx`等静态文件标识的网站链接。很多人可能会好奇,这些链接是否真的指向了服务器上的静态文件?实际上,很多...

    linux下apache开启url重写的方法(详细说明)

    如果遇到问题,可以在`.htaccess`文件中启用`RewriteLog`和`RewriteLogLevel`来帮助调试,但记住在生产环境中关闭这两个选项,因为它们会占用大量日志空间。 了解了以上步骤后,您应该能够成功在Linux的Apache...

    drupal 代码实现URL重写

    Drupal 是一个强大的开源内容管理系统(CMS),其核心功能之一就是支持URL重写,这使得网站的URL更加用户友好和搜索引擎优化。...如果遇到问题,可以考虑利用现有的URL重写模块,或者对问题进行深入调查和调试。

    IIS下配置页面重写(配合插件url-rewrite2去除页面后缀名)的实现方法

    在IIS环境下实现页面URL重写,可以借助专门的插件,比如url-rewrite2。该插件的功能非常强大,可以实现URL的隐藏、路径的美化以及动态页面静态化等高级功能。 首先,要安装url-rewrite2插件,微软官方提供下载地址...

    URL 里面有dll 跟详细文档

    在实际项目中,可能会有一个名为“URL重写”的压缩包,其中包含了实现URL重写功能所需的DLL文件,比如用于处理URL规则的库,以及详细文档,解释如何配置这些规则,如何调试重写过程,以及可能遇到的问题和解决方案。...

    UrlRewrite.dll

    在Windows 7或Windows 8操作系统中,如果开发者在部署或调试Web应用程序时遇到与URL重写相关的功能需求,可能需要确保UrlRewrite.dll已经正确安装并且配置。这个组件通常包含在IIS的URL重写模块安装包内,可以通过...

Global site tag (gtag.js) - Google Analytics