1.域名解析
所有請求域名解析到目標伺服器,為了便於日後遷移維護,應使用別名解析的方式。
2.網站主機頭
為了接收多域名的訪問請求,網站不再設定固定主機頭,而是使用空主機頭的方式。
匹配順序為:IIS接到訪問請求時,根據域名,首先進行主機頭匹配,當匹配到有繫結的主機頭時,該主機頭的網站進行響應。當無法匹配到繫結的主機頭時,空白主機頭的網站進行響應。
空白主機頭IIS下的站點可以設定多個,但只能同時執行其中一個。
3.HTTP請求接管
使用URLRewriter.dll的程式集,並單獨編寫一個處理邏輯,以override的方式對URLRewriter.BaseModuleRewriter中的Rewrite方法進行定製,接管http請求進行路由分發處理
需要考慮請求地址是目錄還是具體檔案的兩種不同情形。
請求地址如果是目錄的情況下,接管邏輯會針對目錄首先執行一次,在請求具體網頁檔案時,接管邏輯會再次執行一次。
因此接管處理邏輯如果僅僅在原有請求地址上增加前置目錄的話,遇到目錄地址的請求會重複增加前置目錄,導致重寫的地址錯誤。需要分情況處理。
在web.config檔案中進行註冊,使接管處理邏輯生效,註冊時錨定的是名稱空間.類
1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Web; 5 using System.Web.Security; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 using System.Web.UI.WebControls.WebParts; 9 using System.Web.UI.HtmlControls; 10 11 namespace RG.SiteHub 12 { 13 /// <summary> 14 /// router 的摘要說明 15 /// </summary> 16 17 public class Router : URLRewriter.BaseModuleRewriter 18 { 19 protected override void Rewrite(string requestedPath, HttpApplication app) 20 { 21 string path = requestedPath; 22 Uri url = new Uri(path);//把請求地址字串轉換為URI物件 23 string domain = url.Host; //獲取域名部分 24 string SendToPath = url.PathAndQuery; //獲取目錄,檔案,引數部分 25 if (domain == "xxx.com") //匹配請求域名 26 { 27 //判斷以“/”為分割的最後一段,是否包含“.”,即可判斷來訪地址是目錄地址還是具體檔案 28 string[] sArray = path.Split('/'); 29 string laststr = sArray[sArray.Length - 1]; 30 if (!laststr.Contains(".")) 31 { 32 //不包含“.”時請求地址是目錄,需要再次判斷最後是否帶“/” 33 if (SendToPath.Substring(SendToPath.Length - 1, 1) != "/") 34 { 35 //若不帶“/”需要補上 36 SendToPath = SendToPath + "/"; 37 } 38 //當請求地址是目錄時,重寫地址補上目錄中的預設檔案,同時打上引數標記,以示區分請求型別 39 /* 40 * 詳細說明: 41 * 當請求型別為檔案時,重寫地址加上前置目錄可以正常訪問 42 * 但請求型別為目錄時,ASP.NET會首先進行處理一次請求,加上前置目錄,在請求預設檔案時,會再次進行處理,前置目錄就會被重複加上,導致無法重寫到真正的地址 43 * 在處理請求發現來源地址是目錄時,重寫至預設檔案並打上標記 44 * 在處理檔案型別的請求時,首先判斷是否存在標記,若有標記,不再重複新增前置目錄 45 */ 46 SendToPath = "/sites/001" + SendToPath + "index.aspx?from=dir"; 47 } 48 49 //判斷是否有標記 50 if (!SendToPath.Contains("?from=dir")) 51 { 52 SendToPath = "/sites/001" + SendToPath; 53 } 54 app.Context.RewritePath(SendToPath);//設定重寫地址 55 } 56 } 57 } 58 }
<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0"/> <httpModules> <add type="RG.SiteHub.Router" name="URL"/> </httpModules> <authentication mode="Windows"/> <customErrors mode="Off"/> </system.web> </configuration>
4.讓ASP.NET接管所有型別的檔案
預設情況下,ASP.NET只接管動態檔案資源,對於html、img、js、css等靜態資源不予處理,需要手動新增對映才能讓所有資源型別全部納入ASP.NET的處理範圍。
選擇目標站點 - 處理程式對映 - 開啟之後的空白處右鍵 - 新增萬用字元指令碼對映 - 可執行檔案選擇相應.net版本的aspnet_isapi.dll即可。
鳴謝:
參考:https://blog.csdn.net/os2046/article/details/7714328
作者:冰山英雄
本文作者:碼農隱於朝
文章地址:https://www.cnblogs.com/webconfig/p/17156596.html