.net
使用UrlReWriter已经把路径全部虚拟了,访问并提交都没有问题,但是有一个缺陷是,只要在虚拟的页面中,有提交按钮或者是回发实现的地方,触发后,URL地址就会自动增加?
例:
路径为:http://localhost/2011021201.html
在本页面中提交后,在重新显示本页,url地址栏路径自动会变成
http://localhost/2011021201.html?id=2011021201
再次提交还是会有,并且是累加这个url
请问这个是如何产生的,如何去掉,url中只保留
http://localhost/2011021201.html谢谢!

解决方案 »

  1.   

    一、使用URL重写的优点:       1、满足搜索引擎的要求。某些搜索引擎不能支持动态页面的抓取,大量的信息就不能被用户搜索到。因此把网站地址改成静态的绝对地址是很有必要的。      2、隐藏技术实现。 有些网站挂着.asp、.jsp开发语言的标记,让人一眼就看出使用什么语言开发的。使用URL重写技术就可以实现地址的隐藏。提高安全性。      3、更加友好的地址,让用户能很好的记住。  二、使用URL重写的缺点:        1、性能有所损耗。     2、处理图片路径或者是CSS路径等,会比较麻烦。          比如:http://www.Test.com/Word和http://www.Test.com/Word.html都是通过url重写定位到同一个页面http://www.Test.com/Word/One.aspx ,都是用同样的处理程序,唯一不同的是为了处理http://www.Test.com/Word这样没有扩展名的地址他必须将*.*映射到aspnet_isapi.dll,而http://www.Test.com/Word.html则是将*.html映射到aspnet_isapi.dll,结果发现http://www.Test.com/Word.html的性能比http://www.Test.com/Word好十至二十倍,因为*.*就是该页面所有的请求,包括css文件和所有的图片文件都有用他写的url重写处理程序去处理,*.html则没有,只是一个请求,问题就出现在这里了,如果http://www.wodecity.com/food这个页面图片很多的话,请求一个页面要同时用url重写处理程序去处理那么多图片,能不慢吗?当然是有处理的方法的。方法1,把存放图片所在的文件夹转化成一个虚拟目录,在然后移处该虚拟目录*.*的映射,这样一来他的url重写程序就不会去处理图片文件,当然存放别的不需要url重写程序的文件也要象图片文件夹做类似的处理,方法2,新建一个站点,如用http://img.wodecity.com/存放图片文件,原理是一样的,都是让你的url重写处理程序不处理那些图片文件。   三、使用URL的方法:     1、下载安装MSDNURLRewriting.msi。          开源代码http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi,下载下来后编译一下就可以了。编译后得到URLRewriter.dll和ActionlessForm.dll两个Dll。   2、在ASP.NET项目的web.config中配置使用。     在<configuration>下面添加一段代码: <configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter"/></configSections>       在<system.web>下面添加一段代码: <httpHandlers> <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" /></httpHandlers>               在<system.web>下面添加一段代码:  <RewriterConfig>
        <Rules>
          <RewriterRule>
            <LookFor>~/index.html</LookFor>
            <SendTo>~/Index.aspx</SendTo>
          </RewriterRule>
          <RewriterRule>
            <LookFor>~/(/d+)-(.*).html</LookFor>
            <SendTo>~/Products/ProductsList.aspx?id=$1&amp;SelectValue=$2</SendTo>
          </RewriterRule>
          <RewriterRule>
            <LookFor>~/(/d+)/(.*).html</LookFor>
            <SendTo>~/Products/ProductsDetails.aspx?ID=$1&amp;CASNO=$2</SendTo>
          </RewriterRule>
        </Rules>
      </RewriterConfig>       其中LookFor是地址栏显示的地址,SendTo是真实的反问地址。当页面带有多个参数的时候,如第一个用$1来表示,第二个用$2来表示,以此类推,而参数于参数中的链接符由"&"改为"&amp;"。LookFor中的(/d+)这些就是正则表达式的写法了。       在页面中的链接也就要修改了,比如<a href="products/productsList.aspx?id=111&SelectValue=a">产品列表</a>就需要修改为<a href="111-a.html">产品列表</a>。   四、回发处理       1、将ActionlessForm.dll添加到项目的bin文件夹。     2、在aspx网页的代码中加<%@ Register TagPrefix="RW" Namespace="ActionlessForm" Assembly="ActionlessForm" %>      3、然后将form标签改为RW:Form(注意开始和结束都要改),TagPrefix可以自定义       4.打开IIS中的文件的属性==》虚拟目录==》配置==》添加。在可执行文件中输入:C:/WINDOWS/Microsoft.NET/Framework/v1.1.432/aspnet_isapi.dll;在扩展名输入*.Html;将确认文件是否存在去掉,点击确定。五、静态页面调用。在反问真正的html文件时,避免找不到文件报错,比如:要反问Link.html这个文件时,链接为www.test.com/Link.html,会出现没有为扩展名“.html”注册的生成提供程序。可以在 machine.config 或 web.config 中的 <compilation><buildProviders> 节注册一个。请确保所注册的提供程序具有包含值“Web”或“All”的 BuildProviderAppliesToAttribute 属性这个错误。在这个里面处理一下就可以了      <compilation defaultLanguage="c#" debug="true">
        <assemblies>
            <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
            <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
            <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    </assemblies>
    <!-- 加上此节点,保证原本就是.html类型的文件能正常访问 -->
    <buildProviders>
    <add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
    </buildProviders>    
    </compilation>