大家应该知道,微软的URLRewrite能够对URL进行重写,但是也只能对域名之后的部分进行重写,而不能对域名进行重写,如:可将
http://http://www.abc.com//1234/ 重写为
http://www.abc.com/show.aspx?id=1234 但不能将
http://1234.abc.com/ 重写为
http://www.abc.com/show.aspx?id=1234。
要实现这个功能,前提条件就是
http://www.abc.com/ 是泛解析的,再就是要修改一下URLRewriter了。
总共要修改2个文件
1.BaseModuleRewriter.cs
protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)

{
HttpApplication app = (HttpApplication) sender;
Rewrite(app.Request.Path, app);
}
改为
protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)

{
HttpApplication app = (HttpApplication) sender;
Rewrite(app.Request.Url.AbsoluteUri, app);
}
就是将 app.Request.Path 替换成了 app.Request.Url.AbsoluteUri
2.ModuleRewriter.cs
for(int i = 0; i < rules.Count; i++)

{
// get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";
// Create a regex (note that IgnoreCase is set
)
Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
// See if a match is found
if (re.IsMatch(requestedPath))

{
// match found - do any replacement needed
string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
// log rewriting information to the Trace object
app.Context.Trace.Write("ModuleRewriter", "Rewriting URL to " + sendToUrl);
// Rewrite the URL
RewriterUtils.RewriteUrl(app.Context, sendToUrl);
break; // exit the for loop
}
}
改为
for(int i = 0; i < rules.Count; i++)

{
// get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
string lookFor = "^" + rules[i].LookFor + "$";
// Create a regex (note that IgnoreCase is set
)
Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
// See if a match is found
if (re.IsMatch(requestedPath))

{
// match found - do any replacement needed
string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
// log rewriting information to the Trace object
app.Context.Trace.Write("ModuleRewriter", "Rewriting URL to " + sendToUrl);
// Rewrite the URL
RewriterUtils.RewriteUrl(app.Context, sendToUrl);
break; // exit the for loop
}
}
将
string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";
改成了
string lookFor = "^" + rules[i].LookFor + "$";
完成这2处改动之后重新编译项目,将生成的dll复制到bin目录下。
再就是写web.config里的重写正则了
<RewriterRule>
<LookFor>http://(\d+)\.abc\.com/</LookFor>
<SendTo>/show.aspx?id=$1</SendTo>
</RewriterRule>
好了大功告成,你在IE地址栏输入
http://1234.abc.com/,就可以看到
http://www.abc.com/show.aspx?id=1234
的结果了
若你在实际应用中碰到了问题,请查看文章 "修改UrlRewrite以对域名进行重写"需要注意的问题 ,希望能够帮助你!
附:
URLRewriter 的相关资料
http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
另:本人有偿提供完整用户域名解决方案, Email:kerry-jiang#hotmail.com
posted @ 2005-09-29 14:08
江大鱼 阅读(16744)
评论(67) 编辑 收藏 网摘 所属分类:
ASP.NET
发表评论
已经按以上步骤做了,似乎不能显示。不知道还有什么地方要注意呢?
谢谢~~
#2楼[
楼主]2005-11-14 13:25 |
有些细节要注意以下,我过几天来重新整理一下!
老大,我也是按这实现不了,细节是什么呀。。。。谢了
#5楼[
楼主]2006-02-20 13:33 |
江兄,你好.我看了你的,觉得比较不错.不过我现在有一个问题,希望你能够帮我解决一下.也是关于url重写二级域名的问题.要想实现的功能如下:
将aaa.laoyu.com重写为www.laoyu.com/web/aaa,请问一下,怎么对urlwriter进行修改.请指教,我不胜感激!!!
#7楼[
楼主]2006-03-10 11:27 |
问个问题
RewriterUtils
这个HELPR 类那里来的?
我编译后总是
找不到类型或命名空间名称“RewriterUtils”(是否缺少 using 指令或程序集引用?)
大哥帮帮忙了
#10楼[
楼主]2006-05-17 15:21 |
问个问题:
BaseModuleRewriter.cs和ModuleRewriter.cs怎么找到这两个文件.
我用提VS.net 2005
谢谢!
如果想把 这段代码 ().Path+\"\\\\xiao[1].exe\" 换成类似的代码
要怎么换? ().Path 这个要怎么换!
江大鱼:
你好,看了你的文章,我解决了如何实现博客的域名。但是,现在又遇到了一个新的问题,我的开发环境是asp.net.20,使用自带的登录控件。该控件在www.abc.com登录后,在b123.abc.com域名的页面中,显示还是没有登录的。
请问如何解决这个问题?谢谢。
我是想用二级域名访问站点中的文件,按照你的方法我做了, 然后在Web.Config配置,
<system.web>
<RewriterRule>
<LookFor>http://pd\.china2auto\.com\.cn</LookFor>
<SendTo>/pd</SendTo>
</RewriterRule>
</system.web>
结果出现
无法识别的配置节 system.web/RewriterRule
请问如果解决?请帮助
@ourgsalei
web.config 文件Rewrite配置信息不完全,
请参考 微软的URLRewrite的配置文件
<table><tr><Td>dddddddddd</td></tr></table>
@jzy_wh
谢谢你之前的回答,用到原先的dll我测试成功了,能够成功转向。
请教你几个问题:
但跟据你的配置,重新生成dll文件,然后测试转向反而不正常了,请问这是哪方面的原因,是否可以把你的重新生成的dll文件发给我下,麻烦了。
还有二级域名的问题,我的二级域名是固定的,我想二级域名访问pd目录下的文件,是否更新了dll文件,再这样设置就可以了?还是除了根据你的“需要注意的问题 ”还需要其他的配置呢?
问题比较多,不好意思。先谢了^-^
<RewriterRule>
<LookFor>http://pd\.china2auto\.com\.cn</LookFor>
<SendTo>~/pd</SendTo>
</RewriterRule>
我的email:aleis@vip.163.com
回复 @jzy_wh
现在二级域名可以使用了,跳转是跳转了,但我设置了始终跳转到站点首页,这又是什么原因呢?
<RewriterRule>
<LookFor>http://pd\.abc\.com\.cn</LookFor>
<SendTo>/pd/Help.aspx</SendTo>
</RewriterRule>
楼主,您好。
我按照您的方面对UrlRewrite代码进行修改并重新编译,编译之后系统重新加载,以前的url重写就全部失效了。全部显示无法找到文件,不知原因为何?
这个时候我还没有做二级域名的试验,或者说按这种方法编译后,以前的配置文件需要重新改写?
希望能得到您的帮助。
@ourgsalei
try:
<RewriterRule>
<LookFor>http://pd\.abc\.com\.cn(/?)</LookFor>
<SendTo>/pd/Help.aspx</SendTo>
</RewriterRule>
最好在服务器上debug一下, 能更快的发现问题
谢谢江大鱼,加上域名后可以访问了。
但还有一个新的问题,以前www.abc.com/list/1/?id=5是可以访问的,现在后面再接?号带参数就不可以了。
是不是还需要做什么其他的写法处理呢?
@jzy_wh
你好,二级域名我还是没有搞定,特此请教下~
假如我想要这个二级域名,
http://pd.abc.com.cn/,那这个域名需要去开通,然后再iis上面新建一个站点么?然后再连接过去?
假如不需要这么做的话,我已经造你方面操作了,但结果还是该页无法显示,小弟实在搞不定,希望得到您的帮助
<RewriterRule>
<LookFor>http://pd\.abc\.com\.cn</LookFor>
<SendTo>/pd/default.aspx</SendTo>
</RewriterRule>
楼主老大~
URLRewriter下不了啊。能不能发一份到我的邮箱里。
heyongsheng@gmail.com
谢了。
楼主,我编译后不能用,能不能发给我一份你编译好的DLL,谢谢
xb.net@126.com
很感谢博主提供的这个方法。试着做了,有些问题。
我用IIS架了几个站点(可能这就是问题所在)。
我要对username.blog.abc.com做映射到blog.abc.com/users/username
在网上搜索一番,找到对单个站点做范解析的方法,给该站点的主机头列表加一个空的主机头。似乎能行(我也找不出检验方法)。
我的映射规则:
<LookFor>http://(\w+)\.blog\.abc\.com</LookFor>
<SendTo>http://blog\.abc\.com/users/$1</SendTo>
然而似乎总是映射到blog.abc.com有点搞不明白了。
不知道这个是不是和我用的atlas有关,因为atlas也在httpmodules里添加了一些模块。我快搞糊涂了。。。
好像也不是,今天又重新把原版的dll用了一下,似乎能对路径进行重写,而用博主的方法似乎不能对域名重写,我的再找一下了。。。。。。
您好
我想请教一下:
一是那个二级域名要不要去虚拟主机都一一绑定啊
二是有没有那个编译好的DLL啊,我编译的好象有点问题,不能用
万分感谢了!
请问这个错是怎么回事
Web.config 重写正则
<RewriterRule>
<LookFor>http://BBS\.XXX\.com\.cn</LookFor>
<SendTo>~/Default.aspx</SendTo>
</RewriterRule>
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------
值不能为空。
参数名: value
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ArgumentNullException: 值不能为空。
参数名: value
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[ArgumentNullException: 值不能为空。
参数名: value]
System.Web.Caching.CacheEntry..ctor(String key, Object value, CacheDependency dependency, CacheItemRemovedCallback onRemovedHandler, DateTime utcAbsoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, Boolean isPublic) +3511731
System.Web.Caching.CacheInternal.DoInsert(Boolean isPublic, String key, Object value, CacheDependency dependencies, DateTime utcAbsoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback, Boolean replace) +88
System.Web.Caching.Cache.Insert(String key, Object value) +83
DomainName.Config.RewriterConfiguration.GetConfig() +129
DomainName.ModuleRewriter.Rewrite(String requestedPath, HttpApplication app) +61
DomainName.BaseModuleRewriter.BaseModuleRewriter_AuthorizeRequest(Object sender, EventArgs e) +116
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +64
搞几天了没搞定,
谁有已经写好的完全二级域名解析程序呢?
发个代码出来吧。
都是假的,原来url重写不能用,
现在的二级域名没实现。晕倒。
楼主,能不能共享完全二级域名解析程序呢?
搞了好久还是实现不了?郁闷!!
我用UrlRewrite重写URL后,又出现问题了,因为有些页面不是.aspx的,而且用.shtml的。
现在,我用shtml包含文件 ,格式如下:
<!--#include file="ShortcutMenu.htm" -->
但不知为什么,就是不能显示此页面。
请问如何解决呢?
江兄,我头都搞大了.
我现提示:
无法找到资源。
说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。
请求的 URL: /
不知道怎么回事.
我都把
context.RewritePath("~/user1/500/index.html");
我试了一下, 发现出现(您没有许可访问这个页面)的页面, 我用的是Windows 2003 small busniess的操作系统。
寻求帮助!!
david@e-firmen.com
@黑白之间
有你这样写正则表达式的呀
<RewriterRule>
<LookFor>http://BBS\.(\w+)\.com\.cn</LookFor>
<SendTo>~/Default.aspx?name=$1</SendTo>
</RewriterRule>
只有这样写才行,因为你这里是二级域名重写后面的参数是$1是在表示在Default.aspx这个页面用的你的传过的名字或者id在(\w+)代替
我按照江兄的方法做了...可编译的时候不行!
现在急着用这个...江兄能发一份编译好了的Dll文件给我吗?
小弟万分感激!我的邮箱是:ghdzheng@163.com
谢谢!
麻烦博主,能不能将您编译好的Dll文件发一份给我?小弟万分感激!我的邮箱是:fudongwatch@126.com 谢谢!
这么简单的东西,LZ还 “有偿提供完整用户域名解决方案”
呵呵
#47楼[
楼主]2008-12-05 10:44 |
@蓉青姚
恩,对的.
正则匹配不是很好的做法, 重写产生的一系列的问题也不是很容易能够解决.
如果需求仅限于本篇以及相关文章,在实现过程如果出现问题的话可以直接email给我。
你好,我想请问下能实现这样的吗?
www.123.com?uid=111能
重写为 user111.123.com或者 111.123.com 吗?
请问能给我提供方法吗?谢谢,新年快乐
按你的做法,我现在有个问题:
我的博客和网站其他文件在一个站点里,建立域名的时候只能让域名指向到网站根目录default.aspx文件,网站首页是根目录下Index.aspx文件,在default.aspx文件中解析,判断地址栏的域名,然后 Response.Redirect("User/Index.aspx");到User目录下页面(user是个人博客文件夹),
config中做了:
<RewriterRule>
<LookFor>http://(\s+)\.blog\.xxx\.cn/User/Index\.aspx</LookFor>
<SendTo>~/User/Index.aspx</SendTo>
</RewriterRule>
但是现在 abc.blog.xxx.com(abc为用户名),跳转到 http://abc.blog.xxx.com ,
我想实现访问博客主页时:地址栏一直是abc.blog.xxx.com
访问博客其他页面时,地址栏是 abc.blog.xxx.com/blogs.aspx,abc.blog.xxx.com/photo.aspx
这个怎么实现?
这个做法是针对一个站点上只有个80端口的吧
假若有两个站点
www.abc.com
www.def.com
我都想实现二级域名,如下
a.abc.com
b.abc.com
d.def.com
e.def.com
我应该怎么办呢
我想实现的是 aaa.abc.com www.abc.com/aaa 而且很多个,怎么弄呀