.NET url重写示例
1.下载 URLRewriter.dll 引用到项目里。
2.在配置文件web.config添加
<configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter"/> </configSections>
3.配置重写规则
<RewriterConfig>
<Rules>
<!--如果有多个参数,用()
<LookFor>~/List(\d+)/List_(\d+)\.aspx</LookFor>
<SendTo>~/List.aspx?ClassID=$1&Page=$2</SendTo>
-->
<!--=======================================-->
<!-- 1 html重写-->
<RewriterRule>
<LookFor>~/lesson/(\d{0,999999})/(\d{0,999999})\.html</LookFor>
<SendTo>~/lesson/lessonplay.aspx?id=$2</SendTo>
</RewriterRule>
<!-- 2 *目录重写-->
<RewriterRule>
<LookFor>~/lesson/(\d{0,999999})/</LookFor>
<SendTo>~/lesson/lesson.aspx?id=$1</SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>~/lesson/</LookFor>
<SendTo>~/lesson/index.aspx</SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>~/lesson</LookFor>
<SendTo>~/lesson/index.aspx</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
4.
web.config 配置好后,
A:针对html还需要配置一下IIS站点属性,IIS站点>属性>主目录>配置>,这里添加一个和.html的扩展名映射,可执行文件和.aspx的是一样的,同时取消确认文件是否存在选项。

配置完这个以后html 重写就生效了。
B:对于目录url重写情况需要在.aspx添加一个*.*的映射,可执行文件和.aspx的也是一样的,同时取消确认文件是否存在选项。

这样目录url重写就可以浏览了。
5.为让原本的html文件能正常访问,需要在<compilation >节点里添加下面一行
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" /> <!--加上这个节点,保证原本就是.html类型的文件能正常访问-->
</buildProviders>
在本地图片、css、js可能不能正常显示。需要配置到IIS上。
6.可能存在的问题和解决办法:
A.图片不显示(CSS、JS路径不对) (若图片显示正确,不必修改)
修改图片的代码路径,例如:
<img src="images/map.gif" />
修改为:
<img src="http://images.cnblogs.com/images/map.gif" />
B.网站性能下降
解除图片文件夹的*.*映射(CSS、JS文件夹的操作是一样的)
IIS站点>图片文件夹>属性>目录>创建,删除如下图所示的那一项之后就解除了该文件夹下的*.*映射

这样配置完了之后,图片可以正常显示,并且能显著解决url重写后对整个站点带来的性能问题。
代码示例下载:这里
后记:
最后一步,不能删除*的扩展映射
删除后,就不能启用无后缀的重写,类似: mi.com/cgi/10145
但启用无后缀重写后,就等于把该站点所有文件都通过aspnet_isapi.dll来处理,这时候访问页面,css,js,图片都没有显示,打开打一个css文件提示:
没有为扩展名“.css”注册的生成提供程序。可以在 machine.config 或 web.config 中的 <compilation><buildProviders> 节注册一个。请确保所注册的提供程序具有包含值“Web”或“All”的 BuildProviderAppliesToAttribute 特性。
这是因为程序把css文件当做一个动态程序了,解析自然会出错,
这个时候,
就需要在web.config文件里配置css,js,等不需动态处理的文件不要经过动态程序处理
配置如下:
<httpHandlers>
<!-- 不需动态处理的文件后缀,都需要写这里 -->
<add verb="*" path="*.js" type="System.Web.StaticFileHandler"/>
<add verb="*" path="*.css" type="System.Web.StaticFileHandler"/>
<add verb="*" path="*.jpg" type="System.Web.StaticFileHandler"/>
<add verb="*" path="*.png" type="System.Web.StaticFileHandler"/>
<add verb="*" path="*.gif" type="System.Web.StaticFileHandler"/>
<!--需要动态处理的文件-->
<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler,URLRewriter"/>
<add verb="*" path="*" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/>
</httpHandlers>
保存后,css,js,图片,都可正常访问。若该站点下新增一种文件后缀,都需要在配置文件里添加一条,交由静态处理。
但这有一个弊端:若在该站点下,有一个用于下载的rar文件,但又没有在配置文件里添加handlers,这个文件就无法下载,也会报错。
所以:
所有静态资源文件,应该放到二级域名或其他域名下,不需要经过动态程序处理,访问速度上也较快,也便于管理文件

浙公网安备 33010602011771号