您的位置:首页 > 编程语言 > ASP

ASP.NET 使用URLRewriter 重写二级域名

2011-03-18 16:10 351 查看

ASP.NET使用URLRewriter重写二级域名

这里要求对域名进行重写,实现http://1234.abc.com/到~/Defa.aspx?id=1234的重写。

第一:域名

首先域名要支持泛解悉,就是域名解悉的主机名为星号*,例:*.abc.com。如下图



这样能保证你在浏览器地址栏输入任何前缀,DNS都会把它们指向到你指定的IP地址上。

第二:IIS设置(Win2003+IIS6为例)

(1)网站必须为Web服务器的默认站点,即端口号为80,主机头为空的站点。如下图所示。



该站点接收所有对该服务器的HTTP请求(其它设置为主机头的站点除外)。所以任何二级域名访问该服务器都会由该站点进行处理。

(2)另外要在站点的“通配符应用程序映射”列表中添加ASP.NET的Web请求处理程序aspnet_isapi.dll。如下图所示。



在这里的设置,是让该站点接到的所有请求都交给aspnet_isapi.dll处理。

第三:修改Microsoft的URLRewriter。

运行开源项目URLRewriter。这里需要修改两个地方:

(1)BaseModuleRewriter.cs类

viewsourceprint?

01
protected
virtual
void
BaseModuleRewriter_AuthorizeRequest(
object
sender,EventArgse)
02
03
{
04
05
HttpApplicationapp=(HttpApplication)sender;
06
07
//Rewrite(app.Request.Path,app);
08
09
Rewrite(app.Request.Url.AbsoluteUri,app);
//######这里修改了
10
11
}
这里将app.Request.Path替换成了app.Request.Url.AbsoluteUri

(2)ModuleRewriter.cs类

viewsourceprint?

01
protected
override
void
Rewrite(
string
requestedPath,System.Web.HttpApplicationapp)
02
03
{
04
05
//loginformationtotheTraceobject.
06
07
app.Context.Trace.Write(
"ModuleRewriter"
,
"EnteringModuleRewriter"
);
08
09
10
11
//gettheconfigurationrules
12
13
RewriterRuleCollectionrules=RewriterConfiguration.GetConfig().Rules;
14
15
16
17
//iteratethrougheachrule...
18
19
for
(
int
i=0;i<rules.Count;i++)
20
21
{
22
23
//getthepatterntolookfor,andResolvetheUrl(convert~intotheappropriatedirectory)
24
25
//stringlookFor="^"+RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,rules[i].LookFor)+"$";
26
27
string
lookFor=
"^"
+rules[i].LookFor+
"$"
;
//######这里修改了
28
29
30
31
//Createaregex(notethatIgnoreCaseisset...)
32
33
Regexre=
new
Regex(lookFor,RegexOptions.IgnoreCase);
34
35
36
37
//Seeifamatchisfound
38
39
if
(re.IsMatch(requestedPath))
40
41
{
42
43
//matchfound-doanyreplacementneeded
44
45
string
sendToUrl=RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,re.Replace(requestedPath,rules[i].SendTo));
46
47
48
49
//logrewritinginformationtotheTraceobject
50
51
app.Context.Trace.Write(
"ModuleRewriter"
,
"RewritingURLto"
+sendToUrl);
52
53
54
55
//RewritetheURL
56
57
RewriterUtils.RewriteUrl(app.Context,sendToUrl);
58
59
break
;
//exittheforloop
60
61
}
62
63
}
64
65
66
67
//LoginformationtotheTraceobject
68
69
app.Context.Trace.Write(
"ModuleRewriter"
,
"ExitingModuleRewriter"
);
70
71
}
这里将stringlookFor="^"+RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,rules[i].LookFor)+"$";

改成了stringlookFor="^"+rules[i].LookFor+"$";

这两个地方修改完以后,生成项目。将项止目bin/Debug目录下的URLRewriter.dll文件Copy到我们要重写URL的项目中。

第四:配置项目
(1)在web.config文件的configSections节点下添加如下一行代码

<sectionname="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter"/>


这里配置一个重写配置的类

(2)修改httpModules节点,在里面添加一行配置代码

<addtype="URLRewriter.ModuleRewriter,URLRewriter"name="ModuleRewriter"/>


(3)在主节点configuration节点下添加路由规则,代码如下:

<!--URL重写将捕获页面转发到实际地址-->

<RewriterConfig>

<Rules>

<RewriterRule>

<LookFor>http://(\w+).abc.com/</LookFor>

<SendTo>~/Defa.aspx?id=$1</SendTo>

</RewriterRule>

</Rules>

</RewriterConfig>

<!--URL重写将捕获页面转发到实际地址(结束)-->


代码里一个RewriterRule节点就是一个规则,这时只有一个,即把域名中的主机头部分做为Defa.aspx页面的id参数的值发送给Defa.aspx页面。

注意:这里LookFor节点里的http://(\w+).abc.com/不能少了最后的反斜框

OK,一切完工

发布,上传到服务器,测试一下,如图



原文链接:/article/5185561.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: