URL重写已经有很多的方法,但是多数都有一个缺点,就是不支持无扩展名的网页。比如把http://www.aaa.com/jyk 转换为 http://www.aaa.com/topic.aspx?id=jyk。微软提供的方法需要在根目录里面建立jyk的文件夹,然后再建立一个default.aspx的文件,如果您有100名会员的话,这是一个不可想象的事情。另一个方法就是使用ISAPI过滤器,但是这个一般需要在服务器上安装一个DLL文件,自己没有服务器就不好办了。下面提供一个可以说是我发明的一个方法——不知道以前有没有人想到过——利用两个特性来实现。第一个:IIS里面的找不到文件的错误设置。第二个:asp.net 里面的Server.Transfer("topic.aspx?id=jyk");这两个结合起来就可以达到我们的目的了。 思路:利用404b错误捕捉客户的请求,再使用Server.Transfer转向。 在我们访问http://www.aaa.com/jyk 的时候,假设这时服务器上没有jyk文件夹,那么会返回什么结果呢?会返回一个“无法找到该页”的页面,那么这个返回结果能不能自己控制一下呢?很幸运IIS提供了这个功能,我们可以把这样的错误指定到网站里的一个页面。 操作步骤:第一步:打开IIS管理器,网站属性——自定义错误标签——404错误——点击修改——修改“消息类型”为“URL”,在下面的文本框里填写处理这个错误得页面名称,比如/none.aspx。第二步:在我们的网站根目录下建立一个none.aspx的网页。在里面随意写点内容(测试用)。 设置完毕,这时再访问http://www.aaa.com/jyk,显示的就是 none.aspx的网页内容了。注意这时浏览器里面的URL地址仍然是http://www.aaa.com/jyk,而不是http://www.aaa.com/none.aspx 。这一点很重要,如果地址变了,那就没有意义了。那么我们怎么把页面转到我们希望的页面呢,这时所有的找不到文件的情况都会转到none.aspx文件,显然这不是我们想要的最终结果。那么我们怎么获取客户输入的网址呢?打开none.aspx的后台文件, string URL = Request.Url.Query;
我们可以使用上面的语句来获取URL地址,得到的地址格式是:?404http://www.aaa.com/jyk其中 “?404”是固定的,过滤掉它就是浏览器里面的URL地址了。剩下的事情就是根据情况来转换网页了。可以拆串,再用switch来判断;也可以用正则表达式来判断。因为我正则不熟,我采用的是switch的方式。正则表达式请参考其他的资料,我也在找,如果您找到了请共享一下,谢谢。优点:1、 支持无扩展名的网页。不用建立文件夹和文件。2、 思路简单,用法也很简单,代码也不复杂,不涉及高深的理论;3、 支持搜索引擎,就是说可以被各大搜索引擎搜录。4、 可以配合域名泛解析使用。缺点:1、 需要修改一下IIS 404b错误的处理方法;2、 效率要略微低一点。3、 如果您只使用.aspx的扩展名的话就可以不用修改IIS了。4、 Asp不支持。因为asp的Server.Transfer不能带参数(?id=jyk),不能传递参数的重写几乎没有什么意义。 这种方法已经实践过了,效果很理想。www.1380000.com 和 www.1370000.com 这两个网站就是使用的这种方法。
本来想发在csdn的blog里面的,可惜又上不去了,所以只好写在这里了。
http://jyk.cnblogs.com/jyk/archive/2007/03/03/aspnetURL.html
我们可以使用上面的语句来获取URL地址,得到的地址格式是:?404http://www.aaa.com/jyk其中 “?404”是固定的,过滤掉它就是浏览器里面的URL地址了。剩下的事情就是根据情况来转换网页了。可以拆串,再用switch来判断;也可以用正则表达式来判断。因为我正则不熟,我采用的是switch的方式。正则表达式请参考其他的资料,我也在找,如果您找到了请共享一下,谢谢。优点:1、 支持无扩展名的网页。不用建立文件夹和文件。2、 思路简单,用法也很简单,代码也不复杂,不涉及高深的理论;3、 支持搜索引擎,就是说可以被各大搜索引擎搜录。4、 可以配合域名泛解析使用。缺点:1、 需要修改一下IIS 404b错误的处理方法;2、 效率要略微低一点。3、 如果您只使用.aspx的扩展名的话就可以不用修改IIS了。4、 Asp不支持。因为asp的Server.Transfer不能带参数(?id=jyk),不能传递参数的重写几乎没有什么意义。 这种方法已经实践过了,效果很理想。www.1380000.com 和 www.1370000.com 这两个网站就是使用的这种方法。
本来想发在csdn的blog里面的,可惜又上不去了,所以只好写在这里了。
http://jyk.cnblogs.com/jyk/archive/2007/03/03/aspnetURL.html
就好像csdn论坛的首页。to:kv4000(ABCD(A Brave Csharp Developer))
当然可以的。
你看 www.1380000.com 网站,都是静态页的形式。to:winner2050(winner)
性能不是太低的,要想重写是必要牺牲一点性能,直接访问.aspx页面效率是最好的。
url="a/125.aspx"Dim r As New Regex("\/(\w*)(?=.aspx|.abc|.html)", RegexOptions.Compiled)m = r.Match(url).Result("$1") 'm=125
list.aspx?id=m 'id=125
性能是差了一点,但是基本可以接受。to:Rail100HttpHandler、HttpModule 很难处理没有扩展名的网页,比如www.cnblogs.com/jyk 另外对于域名泛解析也不是太好处理。
http://msdn2.microsoft.com/zh-cn/library/hs600312(VS.80).aspx
现在我们的处理方式把所有请求都映射给asp.net的dll处理.
1、就像你自己说的,没有服务器就不能装isapi,没有服务器也不好改IIS的设置吧?(倒也不是不可能)
2、相同条件实现相同功能早就有更好的办法,我记得MSDN的Scott写过。不过还是很喜欢你的想法,我就没想到,我太依赖现成的了。
而安装一个isapi就不一定了。更好的方法我是还没有找到了,其他的也都是过了,都不太理想,因为我这里的情况很复杂的。