停止從域(又稱“無 cookie 域”)設置 cookie 以提高站點性能
我正在閱讀有關提高網站速度的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" />
這就是我在我的網站上所做的:
- 使用 ASP.NET 應用程序池在 IIS 上設置網站
- 將綁定主機設置為
your.domain.com
- 注意:您不能使用
domain.com,否則子域將不會是 cookieless
- 在網站上創建一個文件夾,名為
Static- 設置另一個網站,將其指向
Static之前創建的文件夾。- 將綁定主機設置為
static.domain.com- 使用具有非託管程式碼的應用程序池
- 在設置中打開 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 的方法。