程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> url重寫實現任意二級域名或多級域名

url重寫實現任意二級域名或多級域名

編輯:.NET實例教程

簡要回顧:
    修改微軟的URLRewrite能夠對URL進行重寫,這裡要求對域名進行重寫,實現http://1234.abc.com/ 到http://www.abc.com/show.ASPx?id=1234的重寫。
步驟:1、你的域名 http://www.abc.com/ 是泛解析的,並在IIS裡添加了主機頭為空的映射;
 2、修改微軟的URLRewriter,要改兩個地方
      (1).BaseModuleRewriter.cs

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 = "^" + 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目錄下。

3、再就是寫web.config裡的重寫正則了


<RewriterRule>
            <LookFor>http://(\d+)\.abc\.com</LookFor>
            <SendTo>/show.ASPx?id=$1</SendTo>
        </RewriterRule>
注意:
問題出來了,很多人做了,實現了域名的跳轉,但很多人都是轉到了首頁,這裡不是lookfor / to /default.ASPx 的問題,我自己也遇到了這樣的問題,你需要在重寫規則裡加一個“/”在lookFor的結尾什麼的規則改後成了:

<RewriterRule>
            <LookFor>http://(\d+)\.abc\.com/</LookFor>
            <SendTo>/show.ASPx?id=$1</SendTo>
        </RewriterRule>
再一個問題(此問題已用方法二解決),就是修改後的重寫對參數的不友好,重寫後的URL如果帶有參數如http://www.abc.com/news.Html?id=1000,重寫就返回404.下面提供重寫後參數中斷的解決方法:
方法一:
        修改重寫規則,讓正則表達式接受參數:

<RewriterRule>
            <LookFor>http://(\d+)\.abc\.com/news.Html(.{0,})</LookFor>
            <SendTo>/show.ASPx?id=$1</SendTo>
        </RewriterRule>然後你的各種參數都可以匹配到NEWS頁面,比如ID,分頁等,在頁面裡就可以正常使用參數了。

方法二:
    修改上面的BaseModuleRewriter.cs

protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication) sender;
              string path = app.Request.Url.AbsoluteUri;
              
if(path.Contains("?"))
                {
                    path = path.Split(''?'')[0];
                }
             Rewrite(path, app);
        }
把帶“?”的絕對URL拆開,只去匹配不帶參數的URL。

方法三:
    修改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 = "^" + rules[i].LookFor + "(.{0,})$";

                // 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 = "^" + rules[i].LookFor + "$"; 改成string lookFor = "^" + rules[i].LookFor + "(.{0,})$";

還要注意:

1.域名解析問題
      輸入了域名http://1234.abc.com,浏覽器提示找不到網頁。首先,你應該確認你的域名是否支持泛域名解析,就是讓所有的二級,三級域名都指向你的server。其次,要保證你的站點是服務器上的默認站點,就是80端口主機頭為空的站點即可以直接用IP可以訪問的http://1234.abc.com,要麼要提示你的站點的錯誤信息,要麼會正確的執行你定義的URLRewrite,要麼顯示你的站點的首頁。

2.不能執行重寫的問題
      如果你確認你的域名解析是正確的,但是還是不能重寫,訪問http://1234.abc.com會提示路徑"/"找不到...,
如果是這樣的話,你先添加  ASPNET_ISAPI的通配符應用程序映射(這一步是必需的,Sorry!沒有在上篇文章中提出來)。

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


點擊插入按鍵



選擇或輸入C:\Windows\Microsoft.Net\Framework\v1.1.4322\ASPnet_isapi.dll
取消"確認文件是否存在"前的鉤. 
確定

在來訪問http://1234.abc.com  應該是沒有問題了。


3. 默認首頁失效,因為把請球直接交給ASP.Net處理,IIS定義的默認首頁將會失效,出現這種情形:
訪問http://www.abc.com 不能訪問首頁,而通過http://1234.abc.com/default.ASPx可以訪問。
為解決這個問題,請自己在Web.Config中設置 lookfor /  to /default.aspx 或 index.ASPx ..的重寫,完全可以解決問題。

結束
-------------------------------

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved