搞过.NET的朋友应该知道或者听说过URL重写吧,重写到底有什么好处呢,怎么配置才能做到重写URL的效果呢?本文介绍如何使用 ASP.NET 执行动态 URL 重写。
URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。讨论实现 URL 重写的各种技术,并介绍执行 URL 重写的一些实际情况。
重写和生成静态的好处我们可以做个对比就知道了,生成静态的好处就是可以在站点下有单独的文件这样浏览器访问速度会非常快,但是如果是做大型网站的话对服务器的磁盘空间会要求很大,然而URL重写是不会生成真实的单独文件,只是用更简短的URL地址去解析真实的地址,可以说是伪装的,类似URL跳转,URL重写的好处就是对SEO有帮助,唯一的缺陷是对服务器资源消耗大,不过这些都要根据个人情况来做。
下面我们就介绍下如何配置URL重写:
大家在网上看到不少诸如:
等这种详细页面的url。
首先感觉,这种urll很短,隐藏实际路径提高安全性;易于用户记忆和键入; 易于被搜索引擎收录。
事实也正式如此,尤其便于搜索引擎收录以及提高安全(比如:注入攻击等)。
当然,程序直接生成静态页面可以实现的,
但是那样要生成很多这种页面以及文件夹,
而且在数据量大的情况下生成是很浪费时间的,
在这种情况下就要实现url重写了,当然url重写有很多种方法
下面介绍的是基于asp.net下微软的url重写方法(URLRewriter方法)
1.首先下载URLRewriter.dll,下载之后直接复制到你的网站的bin目录中
下载地址
2.配置你的web.config文件
在节点下加
<configSections>
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
以下三个是我自己写的测试的,当然你可以写很多个,这些都是url重写的规则,根据你写的规则,实现不同的功能
这个是把?id=1 生成 这种页面
<RewriterRule>
<LookFor>~/photo/(\d{0,8})\.html</LookFor>
<SendTo>~/list/photo.aspx?id=$1</SendTo>
</RewriterRule>
这个是把 生成 这种页面
<RewriterRule>
<LookFor>~/search\.html</LookFor>
<SendTo>~/search/default.aspx</SendTo>
</RewriterRule>
这个是把?id=10&page=1 生成这种页面,分页的时候使用这种url重写规则
<RewriterRule>
<LookFor>~/list/(\d{0,8})_(\d{0,8})\.html</LookFor>
<SendTo>~/list/default.aspx?id=$1&page=$2</SendTo>
</RewriterRule>
注意在web.config中把&换为&否则不能执行
</Rules>
</RewriterConfig>
同时还要在<system.web>配置节下加:
<httpHandlers>
<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
<add verb="*" path="*" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
3.好了,基本上就可以了,但是还有重要一点千万不要忘了
因为咱们重写的是诸如
.html的后缀
所以需要在iis中进行.html映射(如果咱们上面的链接不用html,直接使用aspx的,如:这种的,就不用实现.html映射,当然,如果想使用别的后缀,如.do等,可以进行.do的映射),方法如下:
右击站点-属性-主目录-配置
在打开页面找扩展名.aspx,双击之后弹出窗口内复制可执行文件
一般是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
复制完之后点添加在弹出窗口把内容复制到可执行文件
扩展名.html当然这个你可以任意写了,不过要和
<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
保持一致.
同时去掉确认文件是否存在,确定即可
完成之后输入
是不是就可以访问了?爽吧
4.下面介绍第三种情况,生成目录,诸如这种url:没有后缀名 ?keywords=%u7684 也没有后缀名的url
这里面稍微有点复杂,同样配置iis
还是在那个弹出窗口,点插入
把复制的文件即C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
复制到可执行文件框内,同时去掉确认文件是否存在,确定即可
这样输入,是不是就可以访问了?嘿嘿
可能读者会有疑问了:现在设置的这个和第二种设置的有什么区别?
现在设置的其实是进行*映射,即把所有的文件都进行url重写处理程序处理
这时其实就可以把.html 以及自带的.aspx等映射去掉,同样可以生成.html/.aspx/ url
好了,如果还想其他的扩展大家就尽情扩展吧。
5.现在再讲一下*映射要注意的问题
因为*映射是把所有的文件都要交给url称谢程序去处理,这样就会造成会把站点下的图片以及css
或者一些下载的rar等文件都要去处理,这样会慢吗?答案是毫无疑问的,肯定会增加内存的,
单单一网站的图片以及上传的图片就足以让程序减慢成倍的速度了。
那有什么办法进行处理吗?
当然,我们可以进行以下处理就可以把速度还原了:
方法1,把存放图片所在的文件夹转化成一个虚拟目录,在然后移处该虚拟目录*.*的映射,这样一来他的url重写程序就不会去处理图片文件,当然存放别的不需要url重写程序的文件也要象图片文件夹做类似的处理。
虚拟目录设置办法:在iis站点右击目录点属性,目录-点创建
然后点配置,在弹出窗口内删除:通配符应用程序映射(执行顺序)下添加的*.*的映射即可。
方法2,把不需要*.*映射的文件夹设置新站点和原来的站点分开,这样在原来的站点访问的时候用
新站点的域名即可。比如把图片设置站点 这样在站点访问图片的时候就必须使用图片名称.gif,这样就避免了所有问件处理。
以上两种方法即可提高不少速度了,当然第一种药方便的多。
6.最后处理回发,即是指当我们在一个经过url重写的页面的提交返回后,一般情况下又返回了真实的路径,而不是咱们处理过的url地址,这种情况就需要咱们在需要处理回发(即提交表单的页面)的页面加上以下代码即可:
<script type="text/javascript">try{document.forms[0].action=""}catch(ex){}</script>
放在<form></form>里面
比如 这个页面是经过url重写之后的,用户留言之后(提交表单)如果不做处理就变成了原始的路径了,如:?ptid=50&page=1 所以我们要处理回发的情况。
大家如果在本地测试的话,就不用诸如:的地址,直接使用本地iis的配置即可测试