Dot-Net

.NET 可以攔截和更改 css 文件嗎?

  • July 31, 2011

更新 1:

我現在已經設置了 IIS6,因此 .NET 可以處理對 .css 文件的呼叫。我現在需要做什麼才能讓它根據引用 url 更改 css 文件?因此,如果引用 url 是http://intranet/,它應該繼續呼叫舊樣式表。如果引用 url 是http://intranetv2/,它應該呼叫新的樣式表。


原始問題:

的背景:

我有 2 個搜尋引擎。一個是舊的,另一個是全新的(發展階段)。搜尋引擎 1 在 domain1.com 上,搜尋引擎 2 在 domain2.com 上。兩個域都在同一台伺服器上。兩者都根據使用者在搜尋引擎中輸入的內容來搜尋 domain1.com 上的網頁。兩個搜尋引擎之間的區別在於,新的搜尋引擎速度更快、結果更準確,並且使用者界面有了很大改進。這兩個搜尋引擎都將保持執行狀態,以便使用者可以在自己的時間習慣新的搜尋引擎,而不是僅僅將它們扔到深處並完全刪除舊的搜尋引擎。

無論如何,背景已經足夠了,基本上,因為可搜尋頁面使用舊搜尋引擎駐留在舊域名上,而新搜尋引擎在新域名上,…

問題:

…我可以使用 HttpModule,或 .NET 的其他部分,或來自 IIS6 的東西,甚至擷取新搜尋引擎生成的頁面連結,並動態更改附加到舊域上舊可搜尋頁面的 css 文件嗎?

原因:

實際上使它看起來像一個全新的站點,如果舊域上的搜尋引擎用於訪問舊域上的頁面,則使用舊樣式表,但如果新域上的搜尋引擎用於訪問訪問舊域名上的可搜尋文件,應使用新樣式表使舊頁面看起來煥然一新。由於有很多可搜尋的頁面,在 10,000 左右,在向頁面添加樣式表之前編輯每個頁面以添加 if 語句來檢查引用域名並不是一個現實的選擇。

環境:

舊的搜尋引擎,以及舊域上的可搜尋頁面使用 .net 1.something,但新域名上的新搜尋引擎使用 .net 3.5,而我使用 vb.net 作為 asp.net 頁面. 伺服器是 IIS6 伺服器。

  1. 在 IIS 中,設置 HttpHandler 以接收您想要的所有文件類型(假設您已經這樣做了)
  2. 使用者Server.MapPath()獲取HttpRequest.Url.AbsolutePath物理路徑
  3. 根據域修改路徑
  4. 將文件寫入響應流。

這是一個處理程序(簡化),我經常使用它來為不同域提供備用文件:

using System;
using System.IO;
using System.Web;
public class MultiDomainFileHandler : IHttpHandler
{
   public void ProcessRequest(HttpContext context)
   {
       string filePath = GetDomainSpecificFilePath(context.Request.Url.Host,
           context.Server.MapPath(context.Request.Url.AbsolutePath));

       if (File.Exists(filePath))
       {
           switch (Path.GetExtension(filePath).ToLower())
           {
               case ".css": context.Response.ContentType = "text/css"; break;
               case ".jpg":
               case ".jpeg": context.Response.ContentType = "image/jpeg"; break;
               //other types you want to handle
               default: context.Request.ContentType = "application/octet-stream"; break;
           }
           context.Response.WriteFile(filePath); //Write the file to response
       }
       else context.Response.StatusCode = 404;
   }

   private string GetDomainSpecificFilePath(string domain, string originalPath)
   {
       string prefix = "";
       switch (domain.ToLower())
       {
           case "intranetv2": prefix = FILE_PREFIX_INTRANETV2; break;
           case "www.example.com": prefix = FILE_PREFIX_EXAMPLE_DOT_COM; break;
           //other domains you want to handle
       }
       string dir = Path.GetDirectoryName(originalPath);
       string fileName = prefix + Path.GetFileName(originalPath);
       return Path.Combine(dir, fileName);
   }

   const string FILE_PREFIX_INTRANETV2 = "v2.", FILE_PREFIX_EXAMPLE_DOT_COM = "ex.com.";
   public bool IsReusable { get { return false; } }
}

現在,您只需要在相同目錄中有備用文件。例如:

/Images/logo.jpg

/Images/v2.logo.jpg

/Styles/mystyle.css

/Styles/v2.mystyle.css

我希望這有幫助 :)

引用自:https://stackoverflow.com/questions/6200427