簡要回顧:
修改微軟的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 ..的重寫,完全可以解決問題。
結束
-------------------------------