Discuz!NT 的URL地址重写(URLRewrite)
2009-03-03 08:56
381 查看
在Discuz!NT中的前台页面访问(特别是aspx)是被HttpModule接管的,所以大家在Discuz.Web
项目的目录下看到的唯一"aspx文件"是index.aspx,而所有其它前台页面都有“/aspx/”文件夹下的相应
的子目录中,而这些子目录名称是与后台所“生成”的模板存在对应关系的。而这种“关系”的绑定是通
过dnt_templates(模板数据表)来进行关联的。而有关模板机制的文章详见:
“Discuz!NT 模板机制分析”一文。
今天所要说的其实是模板机制的“延续”,当然这种“延续”仅是我个人的观点。因为地址重写最终
要绑定的路径,恰恰与模板机制是有着前后呼应的关系。首先请大家看一下这张图:
public class HttpModule : System.Web.IHttpModule
5
上面代码中的Init(HttpApplication context)是HttpModule类进行操作的入口,所有实现
System.Web.IHttpModule 接口的类都必须实现这个函数。
同时大家看到的OnlineUsers.ResetOnlineList()方法主要是用于“重置(复位)在线表”,
而有关“在线用户”的功能我会在以后专门写文章来加以介绍,所以这里大家只要知道它要干的
事(代码如下)即可:)
1 public static int ResetOnlineList()
6
32
而紧随其后的事件绑定代码就是一个关键点了,形如:
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
因为当通过浏览器提交请求时,IIS都会接管请求进行相应的操作(详见DUDU的文章:" ASP.NET 2.0运行时
简要分析")后,最终通过Web.config中的相应配置节(上图所示)来执行用户预定的处理操作。而我们的代码就
在ReUrl_BeginRequest事件中(代码如下,详情见注释):
1 private void ReUrl_BeginRequest(object sender, EventArgs e)
7
94
这样就实现了伪URL的动态转换(地址重写)。而相应的“SiteUrls”类则是对伪URL设置信息
进行访问读取的“封装类”,目的就是要将Discuz.Web项目中config文件夹下的urls.config文件转换
成可访问的信息对象。形如:
1 public class SiteUrls
5
168
因为代码很简单,这里就不再另行说明了。
到目前,我们知道了要通过“urls.config”文件来进行伪URL重写,那么这个文件中的数据到底是什么
样子呢,下面就是在成功安装discuz!nt 2.0产品之后的文件内容:
<?xml version="1.0" encoding="utf-8" ?>
<urls>
<rewrite name="showforum"
path="/showforum-{0}-{1}.aspx"
pattern = "/showforum-(\d+)(-(\d+))?.aspx"
page="/showforum.aspx"
querystring="forumid=$1^page=$3" />
<rewrite name="showtopic"
path="/showtopic-{0}-{1}.aspx"
pattern = "/showtopic-(\d+)(-(\d+))?.aspx"
page="/showtopic.aspx"
querystring="topicid=$1^page=$3" />
<rewrite name="userinfo"
path="/userinfo-{0}.aspx"
pattern = "/userinfo-(\d+)*.aspx"
page="/userinfo.aspx"
querystring="userid=$1" />
<rewrite name="rss"
path="/rss-{0}.aspx"
pattern = "/rss-(\d+)?.aspx"
page="/rss.aspx"
querystring="forumid=$1" />
<rewrite name="spacerss"
path="/spacerss-{0}.aspx"
pattern="/spacerss(-(\d+))?.aspx(\?.*?)?"
page="/rss.aspx"
querystring="uid=$2&type=space" />
<rewrite name="photorss"
path="/photorss-{0}.aspx"
pattern="/photorss(-(\d+))?.aspx(\?.*?)?"
page="/rss.aspx"
querystring="uid=$2&type=photo" />
</urls>
大家看到了吧。就目前而言伪URL重写的页面(page节点)包括如下几个:
showforum.aspx(版块列表),showtopic.aspx(主题列表),userinfo.aspx(用户信息),rss.aspx,
虽然不多,但已基本满足了设置需要。
而设置(配置)管理的页面在后台的“全局”-->“常规选项”-->“基本设置”-->“编辑伪静态url替换
规则”,如果所示:
相信聊到这里大家对我们产品的这项功能应该有个大概认识了,但这不并是全部的设置,因为如果要接管
形如"showforum-1-2.htm"这样的页面,是必须要到IIS里去“搞一把”的。因为默认的IIS中对htm(html)
的处理是无法实现将上面的链接转成“showforum.aspx?forumid=1&page=2”的形式的,所以这里要参考
一下官方文档(使用伪Url地址)中的方法,相应图示如下:
好的,下面再接着聊一下关于与第三方产品“整和”的问题。因为目前大多数采用 .net技术开发的主流产品
(如博客园等)都会或多或少使用与本文类似或相同的做法来实现地址重写功能。比如:继承并实现IHttpHandler
接口。
当然我们的产品所采用实现IHttpModule的方式会比IHttpHandler更早一步被 IIS进行处理。所以如果出现
了这种情况,我个人建议是改动我们产品中的代码,通过在上述 ReUrl_BeginRequest事件中加入条件分支(第
三方程序的伪地址规则)来实现“地址重写整合”;当然如果第三方的 (重写)规则太复杂的话,也可以在我们产
品的相应代码中加入条件分支(只要出现第三方请求的链接页面或指定路径时),但不作任何处理(直接绿灯放行
),这样就会转入到第三方的伪URL重写规则代码的“势力范围”内了。
当然如果第三方也使用类似IHttpModule的实现方式,则要看是谁的配置先出现在web.config中的相应配置
节中了。因为“先入为主”嘛,如果先后顺序已明确的话,那么先被加载的HttpModule 模块就要做一下变动了,
以便不会干扰后面的HttpModule模块的正常运行了。因为我手上这方面的实例也不多,所以只能在这里聊聊我本
人的一些看法,相信随着官方“整合案例” 的增加,这方面的资料会得到更大的补充。
好了,今天就先聊到这吧,如果大家有什么问题,欢迎与我交流:)
项目的目录下看到的唯一"aspx文件"是index.aspx,而所有其它前台页面都有“/aspx/”文件夹下的相应
的子目录中,而这些子目录名称是与后台所“生成”的模板存在对应关系的。而这种“关系”的绑定是通
过dnt_templates(模板数据表)来进行关联的。而有关模板机制的文章详见:
“Discuz!NT 模板机制分析”一文。
今天所要说的其实是模板机制的“延续”,当然这种“延续”仅是我个人的观点。因为地址重写最终
要绑定的路径,恰恰与模板机制是有着前后呼应的关系。首先请大家看一下这张图:
public class HttpModule : System.Web.IHttpModule
5
上面代码中的Init(HttpApplication context)是HttpModule类进行操作的入口,所有实现
System.Web.IHttpModule 接口的类都必须实现这个函数。
同时大家看到的OnlineUsers.ResetOnlineList()方法主要是用于“重置(复位)在线表”,
而有关“在线用户”的功能我会在以后专门写文章来加以介绍,所以这里大家只要知道它要干的
事(代码如下)即可:)
1 public static int ResetOnlineList()
6
32
而紧随其后的事件绑定代码就是一个关键点了,形如:
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
因为当通过浏览器提交请求时,IIS都会接管请求进行相应的操作(详见DUDU的文章:" ASP.NET 2.0运行时
简要分析")后,最终通过Web.config中的相应配置节(上图所示)来执行用户预定的处理操作。而我们的代码就
在ReUrl_BeginRequest事件中(代码如下,详情见注释):
1 private void ReUrl_BeginRequest(object sender, EventArgs e)
7
94
这样就实现了伪URL的动态转换(地址重写)。而相应的“SiteUrls”类则是对伪URL设置信息
进行访问读取的“封装类”,目的就是要将Discuz.Web项目中config文件夹下的urls.config文件转换
成可访问的信息对象。形如:
1 public class SiteUrls
5
168
因为代码很简单,这里就不再另行说明了。
到目前,我们知道了要通过“urls.config”文件来进行伪URL重写,那么这个文件中的数据到底是什么
样子呢,下面就是在成功安装discuz!nt 2.0产品之后的文件内容:
<?xml version="1.0" encoding="utf-8" ?>
<urls>
<rewrite name="showforum"
path="/showforum-{0}-{1}.aspx"
pattern = "/showforum-(\d+)(-(\d+))?.aspx"
page="/showforum.aspx"
querystring="forumid=$1^page=$3" />
<rewrite name="showtopic"
path="/showtopic-{0}-{1}.aspx"
pattern = "/showtopic-(\d+)(-(\d+))?.aspx"
page="/showtopic.aspx"
querystring="topicid=$1^page=$3" />
<rewrite name="userinfo"
path="/userinfo-{0}.aspx"
pattern = "/userinfo-(\d+)*.aspx"
page="/userinfo.aspx"
querystring="userid=$1" />
<rewrite name="rss"
path="/rss-{0}.aspx"
pattern = "/rss-(\d+)?.aspx"
page="/rss.aspx"
querystring="forumid=$1" />
<rewrite name="spacerss"
path="/spacerss-{0}.aspx"
pattern="/spacerss(-(\d+))?.aspx(\?.*?)?"
page="/rss.aspx"
querystring="uid=$2&type=space" />
<rewrite name="photorss"
path="/photorss-{0}.aspx"
pattern="/photorss(-(\d+))?.aspx(\?.*?)?"
page="/rss.aspx"
querystring="uid=$2&type=photo" />
</urls>
大家看到了吧。就目前而言伪URL重写的页面(page节点)包括如下几个:
showforum.aspx(版块列表),showtopic.aspx(主题列表),userinfo.aspx(用户信息),rss.aspx,
虽然不多,但已基本满足了设置需要。
而设置(配置)管理的页面在后台的“全局”-->“常规选项”-->“基本设置”-->“编辑伪静态url替换
规则”,如果所示:
相信聊到这里大家对我们产品的这项功能应该有个大概认识了,但这不并是全部的设置,因为如果要接管
形如"showforum-1-2.htm"这样的页面,是必须要到IIS里去“搞一把”的。因为默认的IIS中对htm(html)
的处理是无法实现将上面的链接转成“showforum.aspx?forumid=1&page=2”的形式的,所以这里要参考
一下官方文档(使用伪Url地址)中的方法,相应图示如下:
好的,下面再接着聊一下关于与第三方产品“整和”的问题。因为目前大多数采用 .net技术开发的主流产品
(如博客园等)都会或多或少使用与本文类似或相同的做法来实现地址重写功能。比如:继承并实现IHttpHandler
接口。
当然我们的产品所采用实现IHttpModule的方式会比IHttpHandler更早一步被 IIS进行处理。所以如果出现
了这种情况,我个人建议是改动我们产品中的代码,通过在上述 ReUrl_BeginRequest事件中加入条件分支(第
三方程序的伪地址规则)来实现“地址重写整合”;当然如果第三方的 (重写)规则太复杂的话,也可以在我们产
品的相应代码中加入条件分支(只要出现第三方请求的链接页面或指定路径时),但不作任何处理(直接绿灯放行
),这样就会转入到第三方的伪URL重写规则代码的“势力范围”内了。
当然如果第三方也使用类似IHttpModule的实现方式,则要看是谁的配置先出现在web.config中的相应配置
节中了。因为“先入为主”嘛,如果先后顺序已明确的话,那么先被加载的HttpModule 模块就要做一下变动了,
以便不会干扰后面的HttpModule模块的正常运行了。因为我手上这方面的实例也不多,所以只能在这里聊聊我本
人的一些看法,相信随着官方“整合案例” 的增加,这方面的资料会得到更大的补充。
好了,今天就先聊到这吧,如果大家有什么问题,欢迎与我交流:)
相关文章推荐
- Discuz!NT 的URL地址重写(URLRewrite)
- Discuz!NT 的URL地址重写(URLRewrite) [转]
- Discuz!NT 的URL地址重写(URLRewrite)
- Discuz!NT 的URL地址重写(URLRewrite) (转)
- Discuz!NT 的URL地址重写(URLRewrite)
- Discuz!NT 的URL地址重写(URLRewrite)
- Discuz!NT 的URL地址重写(URLRewrite)
- Discuz!NT 的URL地址重写(URLRewrite)
- Discuz!NT 的URL地址重写(URLRewrite)
- 使用IIS7官方的Url重写模块,为 Discuz!NT 添加伪静态支持
- urlrewrite 地址重写
- UrlRewrite 关于地址重写来增加安全性
- 利用URLRewriter重写url地址-实现伪静态
- Maven下 urlrewrite 地址重写
- apache重写带有get参数的url地址
- 使用RewritePath方法实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX
- 有关UrlRewrite重写URL
- UrlRewriter重写地址的POSTBACK后,地址还原的解决方法
- Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件
- Url地址重写HttpHander生成静态HTML文件 FckEditor,远程图片下载,插件