Farseer.net轻量级开源框架 中级篇:UrlRewriter 地址重写
上一篇:Farseer.net轻量级开源框架 中级篇: Cookies、Session、Request
下一篇:Farseer.net轻量级开源框架 中级篇: BasePage、BaseController、BaseHandler、BaseMasterPage基类说明
MVC有路由在手,对于重写URL那是小菜一碟,更或者说是与身就有的“技能”,而面对.Net的WebForm就比较尴尬了。对UrlRewriter处在相对比较薄弱的环节。而大家或许会通过对IHttpModule接口的继承来实现对URL的写。
可能用的不多的园友对这块不算的上技术的技术不是很了解。说起重写,那我们说说WebForm的URL请求。当浏览器客户端请求地址后,浏览器会开始解析域名的DNS并找到IP。通过IP + 端口的方式会找到服务器的WEB服务器。(这里举我们常用的IIS服务)
IIS接受到请求后。根据主机头 + 端口 来查找对应的站点。当找到站点后,交由站点的管理。站点通过URL的后缀,比如是.aspx/.html/.css 根据《处理程序映射》来确定该交给谁来处理这个页面。最后由负责处理的程序进行处理并返回显示该页面的内容到浏览器客户端。(这一段说的比较粗略,博主只记得粗略的方式,有说的不对的地方,请见谅。)
上面讲解了请求--->处理--->显示 的过程。
先来说说我们的需求:
A:将原:www.xxx.com/default.aspx 映射到 www.xxx.com/users/default.aspx
B:将原:www.xxx.com/default.html 映射到 www.xxx.com/users/default.aspx
前面A/B 的区别在于 第一个是.aspx 第二个是.html 。同时它们的原路径都将被映射到/users/目录下。这里要注意的是 并不是做跳转操作。也就是说,用户看到的路径,仍然是原来的路径。
说说.html后缀的请求。由于IIS默认的对.html的请求《处理程序映射》是交给“StaticFileModule,DefaultDocumentModule,DirectoryListingModule”进行处理的。
换句话说,它是不经过asp.net处理的。所以当来自这个路径的请求。都是跳过asp.net管道直接返回给客户端浏览器的。
而我们要做的目的是让.html的请求交由asp.net处理。(只有通过asp.net处理,你才能用程序介入)。还有一种办法是使用通配符映射的方式交给asp.net 处理。即所有的后缀、目录都交由asp.net受理。
但这种方式的请求包括css、jpg、js等所有的请求都会由asp.net处理。这种方式是会严重影响到性能的哦。
现在我们可以通过Web.Config来改变这种请求方式
IIS7+:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="QynUrlRewriter" type="FS.Utils.IHttpModule.UrlRewriter" />
<remove name="Session" />
<add name="HtmlSession" type="System.Web.SessionState.SessionStateModule" />
</modules>
<handlers>
<add name="Rewriter" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
</handlers>
</system.webServer>
上图中如果使用了经典模式,则使用<handlers>节点的配置。如果启用集成模式,则使用<modules>节点。
IIS6-:
<system.web>
<httpModules>
<add name="UrlRewriter" type="FS.Utils.IHttpModule.UrlRewriter"/>
</httpModules>
</system.web>
对于IIS6,还需要在IIS中进行设置通配符的映射。将 * 的受理交由:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" (注意区分32位/64位)如果IIS设置为32位启动,则应使用32位的aspnet_isapi.dll
回顾下,上面我们做了什么?其实我就只做了2件事情:
- 把通配符交由Asp.Net处理。
- 指定由FS.Utils.IHttpModule.UrlRewriter来处理这些请求。
在上面的配置中,大家会看到使用了:FS.Utils.IHttpModule.UrlRewriter 的类。这个类就是用来受理重写的。当交由asp.net处理时,都会通过这个类进行判断如何操作。
有处理程序(FS.Utils.IHttpModule.UrlRewriter)就肯定有配置重写规则的文件。这个配置文件在:~/App_Data/UrlRewriter.config 中。使用的是正则表达式。
我们来看看UrlRewriter.config的内容吧:为了方便大家理解,我把这段程序放到了Demo中:SVN: \Farseer\Framework\V0.2\Demo
<?xml version="1.0"?>
<RewriterConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Rules Descript="重写演示">
<RewriterRule Descript="URL映射">
<LookFor>http://localhost:(\d+)/(\d+).html</LookFor>
<SendTo>~/UrlRewriter.aspx?ID=$2</SendTo>
</RewriterRule>
<RewriterRule Descript="URL映射">
<LookFor>http://localhost:(\d+)/(\d+)-(\d+).html</LookFor>
<SendTo>~/UrlRewriter.aspx?ID=$2&ID2=$3</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
看下我们的UrlRewriter.aspx文件(文件命自己随意命名)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
我的ID 是:<%=FS.Utils.Web.Req.QS("ID")%> <br />
我的ID2是:<%=FS.Utils.Web.Req.QS("ID2")%>
</body>
</html>
请在我们看下请求不同的路径返回的结果:



细心的读者已经看到,我们根本没有333333.html或者333333-222.html的文件。这就是重写URL的魅力。客户端显示的路径仍然是xxx.html路径。然而实际对应的物理文件确是:UrlRewriter.aspx文件。
到此,我们的URL重写就讲完了。不过在这里还有一个没提到。就是在UrlRewriter.Config中。是支持域名变量的,什么意思呢。有时候,测试环境跟生产环境的http地址是不一样(甚至域名完全不一样)的。
考虑到这点。支持域名变量的形式。比如在上文中的正则用的是:
<LookFor>http://localhost:(\d+)/(\d+).html</LookFor>
而使用域名变量,我们可以转变成:
<LookFor>http://{0}/(\d+).html</LookFor>
第二行中的{0}对应的是:General.config 配置文件的:RewriterDomain节点配置。并且用 ; 符合分隔。所以可以支持多个这样变量:{0}、{1}、{2}
这结讲述了利用Farseer.Net的UrlRewriter技术在asp.net的WebForm下实现地址重写。操作起来很简单。大家赶紧试下吧。
上一篇:Farseer.net轻量级开源框架 中级篇: Cookies、Session、Request
下一篇:Farseer.net轻量级开源框架 中级篇: BasePage、BaseController、BaseHandler、BaseMasterPage基类说明
QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 意为:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
new User { ID = , Name = "张三" }.Insert()
Farseer.net轻量级开源框架 中级篇:UrlRewriter 地址重写的更多相关文章
- Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇 ...
- Farseer.net轻量级开源框架 中级篇:BasePage、BaseController、BaseHandler、BaseMasterPage、BaseControls基类使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 下一篇:Farseer.net轻量级开源框架 中 ...
- Farseer.net轻量级开源框架 中级篇:常用的扩展方法
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...
- Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: SQL执行报告 下一篇:Farseer.net轻量级开源框架 中级篇: Cooki ...
- Farseer.net轻量级开源框架 中级篇:SQL执行报告
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 下一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(M ...
- Farseer.net轻量级开源框架 中级篇:事务的使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...
- Farseer.net轻量级开源框架 中级篇:执行SQL语句
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 下一篇:Farseer.net轻量级开源框架 中级篇: DbFacto ...
- Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 执行SQL语句 下一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 ...
- Farseer.net轻量级开源框架 中级篇:数据绑定
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: DbFactory数据工厂 下一篇:Farseer.net轻量级开源框架 中级篇: ...
随机推荐
- 怎样快速刪除Word中超链接?
有时我们从网上down了一些资料,存到Word文档里,会发现一些文字和图片带有超链接.这其实是Word自动修改功能引起的麻烦,那么,有什么办法可以把这些超链接快速批量删掉吗? 步骤/方法 1 按键盘上 ...
- JAVA程序员常用软件整理
Java类软件:-------------------------------JDK7.0:http://pan.baidu.com/s/1jGFYvAYMyclipse8.5破解版:http://p ...
- Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support.constraint:constraint-layout:1.1.0. Could not resolve com.android.support.constraint:constraint-l
File->Settings->Build, Execution, Deployment->Gradle->取消选中 Offline work 按钮
- usdt源码编译安装
1.依赖关系Boost >= 1.53 2.安装依赖包You will need appropriate libraries to run Omni Core on Unix, please s ...
- fzu 2150(bfs)
Problem 2150 Fire Game Accept: 693 Submit: 2657 Time Limit: 1000 mSec Memory Limit : 32768 KB ...
- 【188】HTML + CSS + JS 学习网站
RGB 取色器 HTML 参考手册 CSS 参考手册 HTML 在线测试工具 上面源码(博客园 - HTML): <style><!-- p.bg_gr ...
- <hr />标签的颜色和粗细设定
设置<hr />的颜色和粗细,不需要用到style,直接用标签的color和size属性: <hr color="red" size="0.5" ...
- SpringBoot项目以服务器方式启动
SpringBoot项目,如果未引入Web相关依赖,不会以服务器方式进行启动,会以应用的方式启动并结束 <dependency> <groupId>org.springfram ...
- Educational Codeforces Round 19 E. Array Queries(暴力)(DP)
传送门 题意 给出n个数,q个询问,每个询问有两个数p,k,询问p+k+a[p]操作几次后超过n 分析 分块处理,在k<sqrt(n)时,用dp,大于sqrt(n)用暴力 trick 代码 #i ...
- bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】
--因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...