博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET“.NET研究”下用URLRewriter重写二级域名
阅读量:6440 次
发布时间:2019-06-23

本文共 3495 字,大约阅读时间需要 11 分钟。

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

  第一:域名

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

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

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

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

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

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

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

  第三:修改Microsoft的URLRewriter。

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

  (1)BaseModuleRewriter.cs类

 
protected
virtual
void
BaseModuleRewriter_AuthorizeRequest(
object
sender, EventArgs e)
{
HttpApplication app
=
(HttpApplication) sender;
//
Rewrite(app.Request.Path, app);
Rewrite(app.Request.Url.AbsoluteUri, app);
//
## ## ## 这里修改了
}

  这里将app.Request.Path 替换成了 app.Request.Url.AbsoluteUri

  (2)ModuleRewriter.cs类

 
1
.
protected
override
void
Rewrite(
string
requestedPath, System.Web.HttpApplication app)
2
. {
3
.
//
log information to the Trace object.
4
. app.Context.Trace.Write(
"
ModuleRewriter
"
,
"
Entering ModuleRewriter
"
);
5
.
//
get the configuration rules
6
. RewriterRuleCollection rules
=
RewriterConfiguration.GetConfig().Rules;
7
.
//
iterate through each rule...
8
.
for
(
int
i
=
0
; i
<
rules.Count; i
++
)
9
. {
10
.
//
get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
11
.
//
string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";
12
.
string
lookFor
=
"
^
"
+
rules[i].LookFor
+
"
$
"
;
//
## ## ## 这里修改了
13
.
//
Create a regex (note that IgnoreCase is set...)
14
. Regex re
=
new
Regex(lookFor, RegexOptions.IgnoreCase);
15
.
//
See if a match is found
16
.
if
(re.IsMatch(requestedPath))
17
. {
18
.
//
match found - do any replacement needed
19
.
string
sendToUrl
=
RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
20
.
//
log rewriting information to the Trace object
21
. app.Context.Trace.Write(
"
ModuleRewriter
"
,
"
Rewriting URL to
"
+
sendToUrl);
22
.
//
Rewrite the URL
23
. RewriterUtils.RewriteUrl(app.Context, sendToUrl);
24
.
break
;
//
exit the for loop
25
. }
26
. }
27
.
//
Log information to the Trace object
28
. app.Context.Trace.Write(
"
ModuleRewriter
"
,
"
Exiting ModuleRewriter
"
);
29
. }

  这里将string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";

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

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

  第四:配置项目

  (1)在web.config文件的configSections节点下添加如下一行代码

 
1
.
<
section name
= "
RewriterConfig
"
type
=
"
URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter
"
/>

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

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

 
1
.
<
add type
=
"
URLRewriter.ModuleRewriter, URLRewriter
"
name
=
"
ModuleRewriter
"
/>

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

 
1
.
<!--
URL重写 将捕获页面转发到实际地址
-->
2
.
<
RewriterConfig
>
3
.
<
Rules
>
4
.
<
RewriterRule
>
5
.
<
LookFor
>
http:
//
(\w+).abc.com/</LookFor>
6
.
< SendTo
>~/
Defa.aspx
?
id
=
$
1
</
SendTo
>
7
.
</
RewriterRule
>
8
.
</
Rules
>
9
.
</
RewriterConfig
>
10
.
<!--
URL重写 将捕获页面转发到实际地址 ( 结束 )
--> 上海闵行企业网站设计与制作="color: #000000;">

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

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

  OK,一切完工

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

  本次测试需要一个类库:URLRewriter.dll (测试版本 1.0.1495.18710)

转载于:https://www.cnblogs.com/waw/archive/2011/10/19/2218095.html

你可能感兴趣的文章
springmvc接口ios网络请求
查看>>
微信公众号去除分享菜单
查看>>
golang中image/draw包用法
查看>>
swiper中遇到的坑
查看>>
PostCss
查看>>
数据结构和算法关系
查看>>
echarts动态添加数据
查看>>
2014年7月9日 用Sourc Insight,Doxygen, Testbed,Logiscopek
查看>>
android学习笔记7--------MVC设计模式
查看>>
[2018/11/13]图像处理
查看>>
利用Arcgis Engine 二次开发的使用和总结
查看>>
css 实现块状样式
查看>>
python隐含的特性
查看>>
程序员必须收藏的14个顶级开发社区!
查看>>
20个linux命令行工具监视性能(下)
查看>>
在virtualBox上安装centos
查看>>
splice JavaScript Array 对象
查看>>
大数据学习001
查看>>
Hibernate关联映射
查看>>
linux下删除文件夹
查看>>