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轻量级开源框架 中级篇: ...
随机推荐
- POJ之01背包系列
poj3624 Charm Bracelet 模板题 没有要求填满,所以初始化为0就行 #include<cstdio> #include<iostream> using na ...
- Hibernate 之 一级缓存
本篇文章主要是总结Hibernate中关于缓存的相关内容. 先来看看什么是缓存,我们这里所说的缓存主要是指应用程序与物流数据源之间(例如硬盘),用于存放临时数据的内存区域,这样做的目的是为了减少应用程 ...
- pymssql.connect(server='.', user='', password='', database='', timeout=0, login_timeout=60, charset='UTF-8', as_dict=False, host='', appname=None, port='1433', conn_properties, autocommit=False, tds_
http://pymssql.org/en/stable/ref/pymssql.html """ This is an effort to convert the py ...
- Struts2自定义过滤器的小例子-入门篇
创建web项目 实现的效果! 用户点击页面不同的链接,后台调用不同的代码! 创建两个类实现共同的接口! public interface Action { String execute(); } ...
- mysql04--存储过程
过程:若干语句,调用时执行封装的体.没有返回值的函数. 函数:是一个有返回值的过程 存储过程:把若干条sql封装起来,起个名字(过程),并存储在数据库中. 也有不存储的过程,匿名过程,用完就扔(mys ...
- ios app 上架AppStore
一.证书的导出 1.1 前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系统. 如果没有帐号可以在打开http://developer.apple.com/ ...
- 四:网络--NSURLConnection基本使用
一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... ...
- 提高你的Python: 解释‘yield’和‘Generators(生成器)’
在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数" ...
- [转]Python3 字典 items() 方法
原文Python3 字典 items()方法 描述 Python 字典 items() 方法以列表返回可遍历的(键, 值) 元组数组. 语法 items()方法语法: dict.items() 参数 ...
- 关于zookeeper的集群搭建
在所有机器上安装完zookeeper之后, 开始进行集群的搭建 1. 修改 ../zookeeper/conf/zoo.cfg 文件 tickTime=2000 dataDir=/usr/local/ ...