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的版本功能。
补充:asp.net教程,基础入门