sp.net UrlRewrite 修改form的action属性问题解决方法

搜索引擎不能支持动态页面的抓取,大量的信息就不能被潜在用户搜索到。用urlrewrite技术你可以把 http://server/news.asp教程?id=111 变成 http://server/news/111.htm 这样他们就会被搜索引擎收录了。google虽然可以抓取动态页面,但是google对动态页面的评分一般低于静态页面。所以,对大量信息发布的网站,把网站地址改变成静态的绝对是值得的

介绍的方法比较合理,但是我认为重载page类也是在一般情况下应该避免的行为,一个是决定哪个页用新page类哪页不用比较麻烦,如果为了省却麻烦,那么在web.config里设置pagebasetype属性也行,但是整个网站的页面都要过一下这个类也不太符合创业用网站的细节要求。

  是不是有更好的办法呢?还真的有,是我今天在研究 asp.net教程 css教程 friendly adapters 的时候醒悟的
这个解决方案基于上面马哥的方案修改,不过前提是必须有.net 2.0的支持。

  .net 2.0框架给asp.net增加了几个特殊目录,其中有一个最容易被忽视的app_browsers目录,这里是用来存放浏览器定义文件的,相关说明可以参考msdn:http://msdn2.microsoft.com/zh-cn/library/ms228122(vs.80).aspx

  在网站根目录创建app_browsers目录,在里面建立一个新的文件起名 rewriteform.browser ,其内容如下:

<browsers>
  <browser refid="default">
    <controladapters>
      <adapter controltype="system.web.ui.htmlcontrols.htmlform"
        adaptertype="kuang.htmlformadapter" />
    </controladapters>
  </browser>
</browsers>

  其中,browser节的 refid="default" 属性是表示扩展系统原有的default.browser文件(位于 %windir%microsoft.netframeworkv2.0.50727configbrowsers ),default.browser 是全部浏览器定义的根,具体细节请参考msdn说明。

  adapter的意思是适配器,在.net领域表示在两个对象之间进行协调的对象,例如ado.net中众所周知的sqldataadapter类就是在sqlcommand和dataset之间协调的adapter。

  asp.net 2.0带来了controladapter的概念,意思是位于system.web.ui.control对象和asp.net之间的adapter,同时也有pageadapter,用于处理system.web.ui.page对象。

  controladapter并没有什么特殊的功能,只不过和重载page类的方法相比较,前者提供了重载web控件render方法的能力而又不需要继承该控件,并且可以只针对特定的控件例如这里的htmlform类。而在马哥的方法中,如果有别的控件也用了action属性,就会被错误的改写。在 rewriteform.browser 文件中,通过 <adapter controltype="system.web.ui.htmlcontrols.htmlform" adaptertype="kuang.htmlformadapter" /> 这行,我指定了要重载htmlform类,并且提供了我自定义的controladapter类的类型 kuang.htmlformadapter
下面这个是自定义的controladapter类的代码:

using system;
using system.web.ui.adapters;
namespace kuang {
  public class htmlformadapter : controladapter {
    protected override void render(system.web.ui.htmltextwriter writer) {
      base.render(new formrewritetextwriter(writer));
    }
  }
}

  和重载page类的手段一样,这段代码也引用了一个自定义的 htmltextwriter 类,以下是该类的实现代码,我自己做了一定的修改:

using system;
using system.io;
using system.web;
using system.web.ui;
namespace kuang {
  public class formrewritetextwriter : htmltextwriter {
    public formrewritetextwriter(textwriter writer) : base(writer) {
      if(writer is htmltextwriter)
        this.innerwriter = (writer as htmltextwriter).innerwriter;
      else
        this.innerwriter = writer;
    }
    public override void writeattribute(string name, string value, bool fencode) {
      httpcontext context = httpcontext.current;
      object rewrotealready = context.items["formactionrewrotealready"];
      if(name == "action" && rewrotealready == null) {
        value = context.request.rawurl;
        context.items["formactionrewrotealready"] = new object();
      }
      base.writeattribute(name, value, fencode);
    }
  }
}

  把以上两段代码放入到网站的app_code目录下,就大功告成了,这个方法一个特别的优点是,不需要改动原来网站的任何代码,连 web.config 都不用改

iis 5.0支持urlrewrite么?

答案很简单,不支持。但是我们可以通过安装服务器扩展让iis支持。

目前有两种产品支持iis 5.0的urlrewrite,isapi_rewrite 和 iis rewrite。

isapi_rewrite: http://www.helicontech.com/download/#isapi_rewrite
iis rewrite :http://www.qwerksoft.com/products/iisrewrite/download.asp

这里只有isapi rewrite的一个lite版本是免费的,其它都是trial版本。isapi rewrite lite的版本功能。

时间: 2024-10-08 13:22:06

sp.net UrlRewrite 修改form的action属性问题解决方法的相关文章

再谈使用UrlRewrite时修改form的action属性问题

虽然我一般属于只看不写的人,但距上一篇post竟然相隔一年多,不得不感慨时间真是快得恐怖啊-- 最近创业,开展了一个Web 2.0项目,之前对Ajax.Url重写技术还有所谓的XHTML+CSS+DIV只停留在理论阶段,现在有机会付诸实践了,结果在玩UrlRewrite的时候就遇到了必然会遇到的ASP.NET的HttpForm自动将真实页面地址赋给action属性的问题. 网上Google了一下,解决办法就三种,添加客户端Java脚本,重载HttpForm或者Page类 老赵这篇帖子说明了添加客

ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前

原文:ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前 背景 当数据量大.查询条件复杂,多样多的时候,我们可能需要单独做一个查询界面,当用户选择设置了相关的查询条件后,点击[查询]按钮,系统就弹出一个新的页面展示出根据条件查询出的数据集. 然后,用户每点[查询]按钮就弹出一个新的页面展示出最新的查询结果. 当然,在较好的用户体验下,我认为不管用户点击了多少次[查询]按钮,系统应该只弹出并有且只有一个页面,这个页面就是展示查询结果的页面了.并且这页面还应

JavaScript获取网页表单action属性的方法

 本文实例讲述了JavaScript获取网页表单action属性的方法.分享给大家供大家参考.具体如下: JavaScript获取网页表单的action属性,即要提交到的url地址,有时候需要提交到当前页面,则可能会设置action为空 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html> <body> <form id="frm1" action="jb51.php&q

JavaScript获取网页表单action属性的方法_javascript技巧

本文实例讲述了JavaScript获取网页表单action属性的方法.分享给大家供大家参考.具体如下: JavaScript获取网页表单的action属性,即要提交到的url地址,有时候需要提交到当前页面,则可能会设置action为空 <!DOCTYPE html> <html> <body> <form id="frm1" action="jb51.php"> First name: <input type=&

Mysql修改datadir导致无法启动问题解决方法

 centos6.2,停止mysqld然后修改/etc/my.cnf datadir的位置,启动mysqld提示FAILED,查看日志 代码如下: 120609 11:31:31 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 120609 11:35:12 mysqld_safe Starting mysqld daemon with databases from /mnt/hgfs/mysql_data 12

修改php.ini不生效问题解决方法(上传大于8M的文件)_php技巧

摘要:上传大于8M的文件需要修改php的配置才可以生效.但是我在网上找了一堆修改配置的资料,但是自己修改之后就是没有生效. 解决方法: 修改php.ini这个选项,网上有很多的教程,可以随便搜. 1.先用root账号,登录到nobody的账户. 2.然后用whereis php命令查看,php.ini所在的位置,修改这个php.ini的文件就可以了. 3.最后重启apache,就可以生效了. 这里的nobody账户就是apache使用的账户,权限很低. 这里主要注意的问题就是你修改的配置文件必须

Mysql修改datadir导致无法启动问题解决方法_Mysql

centos6.2,停止mysqld然后修改/etc/my.cnf datadir的位置,启动mysqld提示FAILED,查看日志 复制代码 代码如下: 120609 11:31:31 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 120609 11:35:12 mysqld_safe Starting mysqld daemon with databases from /mnt/hgfs/mysql_dat

动态设置form表单的action属性的值的简单方法_jquery

用jQuery时,可如下设置: form表单: <form name="myform" id="myform" action="ssss" method="post" onsubmit="getUrl();"> javascript方法: <script type="text/javascript"> function getUrl(){ $('form').at

浅谈jquery采用attr修改form表单enctype不起作用的问题_jquery

做文件上传,需要将表单元素的enctype设置为'multipart/form-data',用jquery的attr方法在目前较新的主流浏览器上测试均可成功,唯独IE下死活不行.后来查阅ie浏览器6,7,8(9+由于开发机为xp,未进行测试)不支持attr的方式来修改enctype属性,需要通过dom元素的原生方法来设置, 代码如下: $('#form1').get(0).encoding = 'multipart/form-data'; 以上这篇浅谈jquery采用attr修改form表单en