Spiga

ASP.NET中实现二级或多级域名(修改UrlRewrite)

2005-09-29 14:08 by 江大鱼, 23704 visits, 收藏, 编辑
大家应该知道,微软的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


作者:江大鱼
出处:http://jzywh.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:江振宇
出处:http://jzywh.cnblogs.com
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
Add your comment

74 条回复

  1. #1楼 快意[未注册用户]2005-11-08 17:03
    已经按以上步骤做了,似乎不能显示。不知道还有什么地方要注意呢?
    谢谢~~
     回复 引用   
  2. #2楼[楼主] 江大鱼      2005-11-14 13:25
    有些细节要注意以下,我过几天来重新整理一下!
     回复 引用 查看   
  3. #3楼 五月人[未注册用户]2006-01-23 09:52
    老大,什么时候整理呀?
    已经过了这么久了!
     回复 引用   
  4. #4楼 急求[未注册用户]2006-02-15 10:49
    老大,我也是按这实现不了,细节是什么呀。。。。谢了
     回复 引用   
  5. #5楼[楼主] 江大鱼      2006-02-20 13:33
    Sorry,请查看

    http://jzywh.cnblogs.com/archive/2006/02/20/334004.html
     回复 引用 查看   
  6. #6楼 老鱼[未注册用户]2006-03-09 15:13
    江兄,你好.我看了你的,觉得比较不错.不过我现在有一个问题,希望你能够帮我解决一下.也是关于url重写二级域名的问题.要想实现的功能如下:
    将aaa.laoyu.com重写为www.laoyu.com/web/aaa,请问一下,怎么对urlwriter进行修改.请指教,我不胜感激!!!
     回复 引用   
  7. #7楼[楼主] 江大鱼      2006-03-10 11:27
    这篇文章已近很详细地说明了如何修改 UrlRewriter啊,修改之后编译,把编译生成dll防到bin目录下,然后再在web.config里面写正则表达式,IIS设置请看
    http://jzywh.cnblogs.com/archive/2006/02/20/334004.html
    看了我这2篇文章,完全可以解决你的问题!
     回复 引用 查看   
  8. #8楼 请教大鱼[未注册用户]2006-04-25 23:37
    按你的方法都实现了,但有一个新问题。

    例如http://www.abc.com/show.aspx?id=1234 影射到了 1234.abc.com
    但是 1234.abc.com/xxx.aspx 1234.abc.com/yyy.aspx怎么去影射? 如果http://www.abc.com/show.aspx?id=1234&pageno=1 这样的url怎么去影射?
     回复 引用   
  9. #9楼 小四[未注册用户]2006-05-16 11:36
    问个问题
    RewriterUtils
    这个HELPR 类那里来的?
    我编译后总是
    找不到类型或命名空间名称“RewriterUtils”(是否缺少 using 指令或程序集引用?)
    大哥帮帮忙了
     回复 引用   
  10. #10楼[楼主] 江大鱼      2006-05-17 15:21
    @小四

    http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx

    中提供下载的代码就包含了全部代码,请确保你的代码是完整的!
     回复 引用 查看   
  11. #11楼 无极1236423455666[未注册用户]2006-05-23 11:33
    问个问题:
    BaseModuleRewriter.cs和ModuleRewriter.cs怎么找到这两个文件.
    我用提VS.net 2005

    谢谢!
     回复 引用   
  12. #12楼 單xin戀ぷ[未注册用户]2006-06-15 17:34
    如果想把 这段代码 ().Path+\"\\\\xiao[1].exe\" 换成类似的代码
    要怎么换? ().Path 这个要怎么换!
     回复 引用   
  13. #13楼 风的颜色[未注册用户]2006-07-27 11:29
    江大鱼:
    你好,看了你的文章,我解决了如何实现博客的域名。但是,现在又遇到了一个新的问题,我的开发环境是asp.net.20,使用自带的登录控件。该控件在www.abc.com登录后,在b123.abc.com域名的页面中,显示还是没有登录的。
    请问如何解决这个问题?谢谢。
     回复 引用   
  14. #14楼 kide111[未注册用户]2006-08-10 11:49
    用域名可以用..但是如:
    http://www.abc.com/2004/04/01.aspx
    跳转不过去..
    http://www.abc.com/2004/04/default.aspx
    正常!
    请问如何修改
     回复 引用   
  15. #15楼 ourgsalei[未注册用户]2006-08-11 19:04
    我是想用二级域名访问站点中的文件,按照你的方法我做了, 然后在Web.Config配置,
    <system.web>
    <RewriterRule>
    <LookFor>http://pd\.china2auto\.com\.cn</LookFor>
    <SendTo>/pd</SendTo>
    </RewriterRule>
    </system.web>
    结果出现
    无法识别的配置节 system.web/RewriterRule

    请问如果解决?请帮助
     回复 引用   
  16. #16楼 jzy_wh[未注册用户]2006-08-11 21:23
    @kide111

    正则表达式未写完全
     回复 引用   
  17. #17楼 jzy_wh[未注册用户]2006-08-11 21:25
    @ourgsalei

    web.config 文件Rewrite配置信息不完全,
    请参考 微软的URLRewrite的配置文件
     回复 引用   
  18. #18楼 13[未注册用户]2006-08-11 21:51
    <table><tr><Td>dddddddddd</td></tr></table>
     回复 引用   
  19. #19楼 ourgsalei[未注册用户]2006-08-12 00:57
    @jzy_wh

    谢谢你之前的回答,用到原先的dll我测试成功了,能够成功转向。
    请教你几个问题:
    但跟据你的配置,重新生成dll文件,然后测试转向反而不正常了,请问这是哪方面的原因,是否可以把你的重新生成的dll文件发给我下,麻烦了。

    还有二级域名的问题,我的二级域名是固定的,我想二级域名访问pd目录下的文件,是否更新了dll文件,再这样设置就可以了?还是除了根据你的“需要注意的问题 ”还需要其他的配置呢?

    问题比较多,不好意思。先谢了^-^

    <RewriterRule>
    <LookFor>http://pd\.china2auto\.com\.cn</LookFor>
    <SendTo>~/pd</SendTo>
    </RewriterRule>

    我的email:aleis@vip.163.com
     回复 引用   
  20. #20楼 ourgsalei[未注册用户]2006-08-12 01:53
    回复 @jzy_wh

    现在二级域名可以使用了,跳转是跳转了,但我设置了始终跳转到站点首页,这又是什么原因呢?

    <RewriterRule>
    <LookFor>http://pd\.abc\.com\.cn</LookFor>
    <SendTo>/pd/Help.aspx</SendTo>
    </RewriterRule>
     回复 引用   
  21. #21楼 baogong[未注册用户]2006-08-13 12:58
    楼主,您好。

    我按照您的方面对UrlRewrite代码进行修改并重新编译,编译之后系统重新加载,以前的url重写就全部失效了。全部显示无法找到文件,不知原因为何?

    这个时候我还没有做二级域名的试验,或者说按这种方法编译后,以前的配置文件需要重新改写?

    希望能得到您的帮助。
     回复 引用   
  22. #22楼 jzy_wh[未注册用户]2006-08-13 13:22
    @ourgsalei

    try:

    <RewriterRule>
    <LookFor>http://pd\.abc\.com\.cn(/?)</LookFor>
    <SendTo>/pd/Help.aspx</SendTo>
    </RewriterRule>

    最好在服务器上debug一下, 能更快的发现问题

     回复 引用   
  23. #23楼 jzy_wh[未注册用户]2006-08-13 13:23
    @baogong

    需要重新写, 前面加上域名!
     回复 引用   
  24. #24楼 baogong[未注册用户]2006-08-14 11:35
    谢谢江大鱼,加上域名后可以访问了。

    但还有一个新的问题,以前www.abc.com/list/1/?id=5是可以访问的,现在后面再接?号带参数就不可以了。

    是不是还需要做什么其他的写法处理呢?
     回复 引用   
  25. #25楼 alei      2006-08-15 02:19
    @jzy_wh

    你好,二级域名我还是没有搞定,特此请教下~

    假如我想要这个二级域名,
    http://pd.abc.com.cn/,那这个域名需要去开通,然后再iis上面新建一个站点么?然后再连接过去?

    假如不需要这么做的话,我已经造你方面操作了,但结果还是该页无法显示,小弟实在搞不定,希望得到您的帮助

    <RewriterRule>
    <LookFor>http://pd\.abc\.com\.cn</LookFor>
    <SendTo>/pd/default.aspx</SendTo>
    </RewriterRule>
     回复 引用 查看   
  26. #26楼 勇仔      2006-08-17 15:16
    楼主老大~
    URLRewriter下不了啊。能不能发一份到我的邮箱里。
    heyongsheng@gmail.com
    谢了。
     回复 引用 查看   
  27. #27楼 肖彬[未注册用户]2006-08-19 09:21
    楼主,我编译后不能用,能不能发给我一份你编译好的DLL,谢谢
    xb.net@126.com
     回复 引用   
  28. #28楼 隐姓埋名[未注册用户]2006-10-03 01:05
    很感谢博主提供的这个方法。试着做了,有些问题。
    我用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有点搞不明白了。
     回复 引用   
  29. #29楼 隐姓埋名[未注册用户]2006-10-03 16:30
    不知道这个是不是和我用的atlas有关,因为atlas也在httpmodules里添加了一些模块。我快搞糊涂了。。。
     回复 引用   
  30. #30楼 隐姓埋名[未注册用户]2006-10-03 18:50
    好像也不是,今天又重新把原版的dll用了一下,似乎能对路径进行重写,而用博主的方法似乎不能对域名重写,我的再找一下了。。。。。。
     回复 引用   
  31. #31楼 梦文[未注册用户]2006-12-04 09:15
    您好
    我想请教一下:
    一是那个二级域名要不要去虚拟主机都一一绑定啊
    二是有没有那个编译好的DLL啊,我编译的好象有点问题,不能用

    万分感谢了!
     回复 引用   
  32. #32楼 黑白之间[未注册用户]2007-01-12 22:53
    请问这个错是怎么回事

    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
     回复 引用   
  33. #33楼 s3[未注册用户]2007-04-24 12:06
    搞几天了没搞定,
    谁有已经写好的完全二级域名解析程序呢?
    发个代码出来吧。
     回复 引用   
  34. #34楼 s3[未注册用户]2007-04-26 14:17
    都是假的,原来url重写不能用,

    现在的二级域名没实现。晕倒。
     回复 引用   
  35. #35楼 Y[未注册用户]2007-05-08 17:37
    楼主,能不能共享完全二级域名解析程序呢?
    搞了好久还是实现不了?郁闷!!
     回复 引用   
  36. #36楼 阿丁[未注册用户]2007-05-21 17:59
    我用UrlRewrite重写URL后,又出现问题了,因为有些页面不是.aspx的,而且用.shtml的。

    现在,我用shtml包含文件 ,格式如下:
    <!--#include file="ShortcutMenu.htm" -->

    但不知为什么,就是不能显示此页面。

    请问如何解决呢?
     回复 引用   
  37. #37楼 杨春风[未注册用户]2007-07-17 15:10
    江兄,我头都搞大了.
    我现提示:
    无法找到资源。
    说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。

    请求的 URL: /

    不知道怎么回事.
    我都把
    context.RewritePath("~/user1/500/index.html");
     回复 引用   
  38. #38楼 pop[未注册用户]2007-07-18 20:16
    2.0不行啊,不支持二级域名哦
     回复 引用   
  39. #39楼 鲁德明[未注册用户]2007-08-04 22:05
    我试了一下, 发现出现(您没有许可访问这个页面)的页面, 我用的是Windows 2003 small busniess的操作系统。

    寻求帮助!!
    david@e-firmen.com
     回复 引用   
  40. #40楼 胡煜[未注册用户]2007-08-15 10:05
    @黑白之间
    有你这样写正则表达式的呀

    <RewriterRule>
    <LookFor>http://BBS\.(\w+)\.com\.cn</LookFor>
    <SendTo>~/Default.aspx?name=$1</SendTo>
    </RewriterRule>
    只有这样写才行,因为你这里是二级域名重写后面的参数是$1是在表示在Default.aspx这个页面用的你的传过的名字或者id在(\w+)代替
     回复 引用   
  41. #41楼 lzhshen[未注册用户]2007-12-06 00:07
    你好,我读了你的blog的文章,摸索着尝试。但是碰到下面的一个问题,希望能得到你的指点。谢谢!

    在不用考虑二级域名的情况下,是可以实现域名的重写。
    比如输入:http://www.soguan360.com/Clubs,
    可以替换为: http://www.soguan360.com/SubClub/Club_Index.aspx?clubID=47

    但是如果,设置成二级域名就不能成功,不管如何都直接显示网站主页。下面是我做二级域名时的改动:
    1. 根据 http://www.cnblogs.com/jzywh/archive/2005/09/29/246650.html 来修改UrlRewrite的源代码,重新编译,然后拷贝到网站的/bin目录下
    2. 修改 web.config url的重写策略如下:
    <RewriterRule>
    <LookFor>http://46\.soguan360\.com</LookFor>
    <SendTo>~/SubClub/Club_Index.aspx?clubID=47</SendTo>
    </RewriterRule>
    在浏览器中输入 http://46.soguan360.com, 都不能跳转到我想要的页面,而是直接显示网站的主页。(我已经设置了泛域名)

    请问这是哪里出了问题? 谢谢!
     回复 引用   
  42. #42楼 阿瑞--16hi      2008-01-21 15:16
    我试了一次, 也没有成功~~
     回复 引用 查看   
  43. #43楼 卡奥斯[未注册用户]2008-02-06 16:01
    呵呵,测试通不过~~
     回复 引用   
  44. #44楼 pxeric[未注册用户]2008-05-11 20:23
    我按照江兄的方法做了...可编译的时候不行!
    现在急着用这个...江兄能发一份编译好了的Dll文件给我吗?
    小弟万分感激!我的邮箱是:ghdzheng@163.com
    谢谢!
     回复 引用   
  45. #45楼 wenhao[未注册用户]2008-10-11 19:53
    麻烦博主,能不能将您编译好的Dll文件发一份给我?小弟万分感激!我的邮箱是:fudongwatch@126.com 谢谢!
     回复 引用   
  46. #46楼 蓉青姚      2008-11-24 10:10
    这么简单的东西,LZ还 “有偿提供完整用户域名解决方案”

    呵呵
     回复 引用 查看   
  47. #47楼[楼主] 江大鱼      2008-12-05 10:44
    @蓉青姚

    恩,对的.

    正则匹配不是很好的做法, 重写产生的一系列的问题也不是很容易能够解决.
    如果需求仅限于本篇以及相关文章,在实现过程如果出现问题的话可以直接email给我。
     回复 引用 查看   
  48. #48楼 fly_to_the_winds[未注册用户]2009-02-06 09:07
    你好,我想请问下能实现这样的吗?
    www.123.com?uid=111能
    重写为 user111.123.com或者 111.123.com 吗?
    请问能给我提供方法吗?谢谢,新年快乐
     回复 引用   
  49. #49楼 liu111[未注册用户]2009-11-07 17:05
    按你的做法,我现在有个问题:
    我的博客和网站其他文件在一个站点里,建立域名的时候只能让域名指向到网站根目录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
    这个怎么实现?
     回复 引用   
  50. #50楼 剑飘红      2010-01-19 16:36
    这个做法是针对一个站点上只有个80端口的吧


    假若有两个站点
    www.abc.com
    www.def.com

    我都想实现二级域名,如下
    a.abc.com
    b.abc.com

    d.def.com
    e.def.com

    我应该怎么办呢
     回复 引用 查看   
  51. #51楼 小傻妞      2010-01-25 11:22
    我有还是不可以啊,请问怎么回事、
     回复 引用 查看   
  52. #52楼 小傻妞      2010-01-25 11:23
    我想实现的是 aaa.abc.com www.abc.com/aaa 而且很多个,怎么弄呀
     回复 引用 查看   
  53. #53楼 iliflxy      2010-09-07 18:25
    你好,我按你的设置了,但访问二级域名时,提示401.1错误
     回复 引用 查看   
  54. #54楼 iliflxy      2010-09-07 18:56
    江大鱼,你的qq是多少呀
     回复 引用 查看   
  55. #55楼[楼主] 江大鱼      2010-09-08 22:38
    email: kerry-jiang hotmail
     回复 引用 查看   
  56. #56楼 海风吹呀吹      2010-11-17 12:42
    正在寻找这方面资料,非常感谢!!
     回复 引用 查看   
  57. #57楼 土豆111      2011-02-25 16:04
    @lzhshen
    解决了没有?
     回复 引用 查看   
  58. #58楼 红涛      2011-04-13 12:27
    Mark
     回复 引用 查看   
  59. #59楼 雪狐狼      2011-05-04 18:01
    好文章,只针对动态有用。静态页面输出似乎有点问题,还需要更改代码。
     回复 引用 查看