UrlRewrite 實現 二級域名 重寫(完整解決方案)

 UrlRewrite 實現 二級域名 重寫(完整解決方案)          微軟的URLRewrite能夠對URL進行重寫,但是也只能對域名之後的部分進行重寫,而不能對域名進行重寫,如:可將 http://www.worldbao.com/showuser.aspx?us=suyiming  重寫爲 http://www.worldbao.com/suyiming.aspx  但不能將 http://www.worldbao.com/show.aspx?us=suyiming 重寫爲  http://suyiming.worldbao.com/

      要實現這個功能,首先要做域名泛解析,去域名管理裏面的域名解析中添加一個:*.worldbao.com 指向服務器ip。

第二,重寫URLRewrite裏面的兩個方法。

1.BaseModuleRewriter.cs  裏面的BaseModuleRewriter_AuthorizeRequest方法

 view plaincopy to clipboardprint?
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.Path, app);
        }

改爲

view plaincopy to clipboardprint?
protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)   
        {   
            HttpApplication app = (HttpApplication) sender;   
            Rewrite(app.Request.Url.AbsoluteUri, app);   
        }  
protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication) sender;
            Rewrite(app.Request.Url.AbsoluteUri, app);
        } 

 

2, ModuleRewriter.cs  裏面的 Rewrite 方法

 view plaincopy to clipboardprint?
    protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)  
    {  
        // log information to the Trace object.  
        app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");  
 
        // get the configuration rules  
        RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;  
 
        // iterate through each rule...  
        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  
            }  
        }  
 
        // Log information to the Trace object  
        app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");  
    }  

  protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)
  {
   // log information to the Trace object.
   app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");

   // get the configuration rules
   RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

   // iterate through each rule...
   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
    }
   }

   // Log information to the Trace object
   app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");
  }
 }

改爲

view plaincopy to clipboardprint?
    protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)  
    {  
        // log information to the Trace object.  
        app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");  
 
        // get the configuration rules  
        RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;  
 
        // iterate through each rule...  
        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  
            }  
        }  
 
        // Log information to the Trace object  
        app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");  
    }  

  protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)
  {
   // log information to the Trace object.
   app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");

   // get the configuration rules
   RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

   // iterate through each rule...
   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
    }
   }

   // Log information to the Trace object
   app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");
  }
 }

就是將

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

改成了

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

 

完成這過程之後將整個項目重新編譯一下。

這些都做完之後,

在webconfig配置裏面的
 <configSections>裏面 添加:
view plaincopy to clipboardprint?
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/> 
  <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/>

在</configSections>下面添加

view plaincopy to clipboardprint?
<RewriterConfig> 
 <!-- 處理默認首頁失敗--> 
 <Rules> 
  <RewriterRule> 
   <LookFor>http://www/.worldbao/.com/</LookFor> 
   <SendTo>~/default.aspx</SendTo> 
  </RewriterRule> 
 </Rules> 
 <!-- 處理默認首頁失敗--> 
 
 <!--二級域名正則--> 
 <Rules> 
  <RewriterRule> 
   <LookFor>http://([a-zA-Z|0-9]+)/.worldbao/.com/</LookFor> 
   <SendTo>/user/user.aspx?us=$1</SendTo> 
  </RewriterRule> 
 </Rules> 
 <!--二級域名正則--> 
</RewriterConfig> 
 <RewriterConfig>
  <!-- 處理默認首頁失敗-->
  <Rules>
   <RewriterRule>
    <LookFor>http://www/.worldbao/.com/</LookFor>
    <SendTo>~/default.aspx</SendTo>
   </RewriterRule>
  </Rules>
  <!-- 處理默認首頁失敗-->

  <!--二級域名正則-->
  <Rules>
   <RewriterRule>
    <LookFor>http://([a-zA-Z|0-9]+)/.worldbao/.com/</LookFor>
    <SendTo>/user/user.aspx?us=$1</SendTo>
   </RewriterRule>
  </Rules>
  <!--二級域名正則-->
 </RewriterConfig>
 

 在httpModules裏面添加

view plaincopy to clipboardprint?
<httpModules> 
    <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/> 
</httpModules> 
  <httpModules>
   <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/>
  </httpModules>

 

最後一步

IIS裏面添加  ASPNET_ISAPI的通配符應用程序映射

操作方法:IIS站點屬性 ->主目錄 ->  配置

 

點擊插入按鍵

 

 

選擇或輸入C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/aspnet_isapi.dll
取消"確認文件是否存在"前的鉤. 確定

 

ok,現在輸入http://suyiming.worldbao.com/就可以看到效果了

 

 

 

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/suyiming/archive/2009/03/01/3944537.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章