多域名路由存取站點子目錄

2023-02-26 15:01:09

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