Asp.net

停止從域(又稱“無 cookie 域”)設置 cookie 以提高站點性能

  • June 17, 2010

我正在閱讀有關提高網站速度的Google 文件。他們的建議之一是從“無 cookie 域”提供靜態內容(圖像、css、js 等):

靜態內容,例如圖片、JS 和 CSS 文件,不需要伴隨 cookie,因為這些資源沒有使用者互動。您可以通過從不提供 cookie 的域提供靜態資源來減少請求延遲。

然後Google表示,最好的方法是購買一個新域並將其設置為指向您目前的域:

要保留一個無 cookie 域來提供靜態內容,請註冊一個新域名並使用 CNAME 記錄配置您的 DNS 數據庫,該 CNAME 記錄將新域指向您現有的域 A 記錄。配置您的 Web 伺服器以提供來自新域的靜態資源,並且不允許在該域的任何位置設置任何 cookie。在您的網頁中,引用靜態資源 URL 中的域名。

這是非常直接的東西,除了它說“配置您的 Web 伺服器以提供來自新域的靜態資源,並且不允許在該域的任何位置設置任何 cookie ”。根據我的閱讀,IIS 中沒有允許您說“提供靜態資源”的設置,那麼如何防止 ASP.NET 在這個新域上設置 cookie?

目前,即使我只是從新域請求 .jpg,它也會在我的瀏覽器上設置一個 cookie,即使我們的應用程序的 cookie 設置為我們的舊域。例如,ASP.NET 設置了一個“.ASPXANONYMOUS”cookie(據我所知)我們並沒有告訴它這樣做。

抱歉,如果這是一個真正的新手問題,我是新手!

謝謝。

如果您不從域寫入 cookie,則域將無 cookie。

當域設置為僅託管腳本、圖像等資源內容時,它們是由來自瀏覽器的純 HTTP-GET 請求請求的。這些內容應按原樣提供。這將使您的域無 cookie。這不能通過網路伺服器配置來完成。Http 是完全無狀態的,網路伺服器根本不知道 cookie。Cookie 是通過伺服器端腳本寫入或發送給客戶端的。最好的辦法是禁用 IIS 應用程序上的 asp.net、classic-asp 或 php 腳本功能。

我們這樣做的方式是。

我們有一個子域設置來提供無 cookie 資源。所以我們在子域上託管我們所有的圖像和腳本。從主應用程序中,我們只需通過它的 url 指向資源。我們通過不在該域上提供任何動態腳本或通過創建任何 asp.net 或 php 會話來確保子域保持無 cookie。

http://cf.mydomain.com/resources/images/*.images
http://cf.mydomain.com/resources/scripts/*.scripts
http://cf.mydomain.com/resources/styles/*.styles

從主域中,我們只是將資源引用如下。

<img src="http://cf.mydomain.com/resources/images/logo.png" />

這就是我在我的網站上所做的:

  1. 使用 ASP.NET 應用程序池在 IIS 上設置網站
  2. 將綁定主機設置為your.domain.com
  • 注意:您不能使用domain.com,否則子域將不會是 cookieless
  1. 在網站上創建一個文件夾,名為Static
  2. 設置另一個網站,將其指向Static之前創建的文件夾。
  3. 將綁定主機設置為static.domain.com
  4. 使用具有非託管程式碼的應用程序池
  5. 在設置中打開 Session State 並檢查Not enabled.

現在你有一個靜態網站。要設置打開web.config文件Static夾下的文件並替換為這個文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <system.web>
   <sessionState mode="Off" />
   <pages enableSessionState="false" validateRequest="false" />
   <roleManager>
     <providers>
       <remove name="AspNetWindowsTokenRoleProvider" />
     </providers>
   </roleManager>
 </system.web>
 <system.webServer>
   <staticContent>
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
   </staticContent>
   <httpProtocol>
     <customHeaders>
       <remove name="X-Powered-By" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>

這將記憶體文件 30 天,刪除 RoleManager(我不知道它是否改變了任何東西,但我刪除了所有我能找到的),並從響應標頭中刪除一個項目。

但是這裡有個問題,即使部署了新版本,你的內容也會被記憶體,所以為了避免這種情況,我為 MVC 製作了一個輔助方法。基本上,您必須附加一些 QueryString ,每次更改這些文件時都會更改。

default.css?v=1   ?v=2  ...

我的 MVC 方法獲取最後寫入日期並附加在文件 url 上:

public static string GetContent(this UrlHelper url, string link)
{
   link = link.ToLower();

   // last write date ticks to hex
   var cacheBreaker = Convert.ToString(File.GetLastWriteTimeUtc(url.RequestContext.HttpContext.Request.MapPath(link)).Ticks, 16);

   // static folder is in the website folders, but instead of
   // www.domain.com/static/default.css I convert to
   // static.domain.com/default.css
   if (link.StartsWith("~/static", StringComparison.InvariantCultureIgnoreCase))
   {
       var host = url.RequestContext.HttpContext.Request.Url.Host;
       host = String.Format("static.{0}", host.Substring(host.IndexOf('.') + 1));

       link = String.Format("http://{0}/{1}", host, link.Substring(9));

       // returns the file URL in static domain
       return String.Format("{0}?v={1}", link, cacheBreaker);
   }

   // returns file url in normal domain
   return String.Format("{0}?v={1}", url.Content(link), cacheBreaker);
}

並使用它(MVC3 Razor):

<link href="@Url.GetContent("~/static/default.css")" rel="stylesheet" type="text/css" />

如果您使用的是另一種應用程序,您可以執行相同的操作,請創建一個在頁面上附加 HtmlLink 的方法。

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