2010-06-17 9 views
23

Tôi đã đọc trong Google's documentation về cải thiện tốc độ trang web. Một trong những khuyến nghị của họ đang phục vụ nội dung tĩnh (hình ảnh, css, js, vv) từ một "miền không có cookie":Dừng cookie được đặt từ tên miền (còn gọi là "miền không nấu nướng") để tăng hiệu suất trang web

nội dung tĩnh, chẳng hạn như hình ảnh, JS và file CSS, không cần phải có kèm theo cookie, vì có không tương tác với người dùng với các tài nguyên này. Bạn có thể giảm yêu cầu thời gian chờ bằng cách phân phát tài nguyên tĩnh từ tên miền không phục vụ cookie.

Google sau đó nói rằng cách tốt nhất để làm điều này là để mua một tên miền mới và thiết lập nó để trỏ đến của bạn hiện thời:

Để tiến hành đặt miền không có cookie cho phục vụ nội dung tĩnh, đăng ký một tên miền mới và định cấu hình cơ sở dữ liệu DNS của bạn với bản ghi CNAME rằng trỏ tên miền mới vào bản ghi A tên miền hiện tại hiện tại của bạn. Định cấu hình máy chủ web của bạn để phân phát tài nguyên tĩnh từ tên miền mới và không cho phép bất kỳ cookie nào được đặt ở bất kỳ đâu trên miền này. Trong các trang web của bạn, hãy tham khảo tên miền trong URL cho các tài nguyên tĩnh .

này là khá thẳng thứ về phía trước, trừ các bit mà nó nói đến "cấu hình máy chủ web của bạn để phục vụ các tài nguyên tĩnh từ tên miền mới, và không cho phép bất kỳ cookie nào được đặt bất cứ nơi nào trên tên miền này ". From what I've read, không có cài đặt trong IIS cho phép bạn nói "phân phát tài nguyên tĩnh", vì vậy, làm cách nào để ngăn ASP.NET cài đặt cookie trên miền mới này?

Hiện tại, ngay cả khi tôi chỉ yêu cầu .jpg từ tên miền mới, nó đặt cookie trên trình duyệt của tôi, mặc dù cookie của ứng dụng của chúng tôi được đặt thành miền cũ của chúng tôi. Ví dụ, ASP.NET đặt một cookie ".ASPXANONYMOUS" (theo như tôi biết), chúng tôi không yêu cầu nó làm.

Xin lỗi nếu đây là câu hỏi thật sự mới, tôi mới làm quen với điều này!

Cảm ơn.

Trả lời

16

Nếu bạn không viết cookie từ miền, miền sẽ không có cookie.

Khi tên miền được đặt để chỉ lưu trữ nội dung tài nguyên như tập lệnh, hình ảnh, v.v, chúng được yêu cầu bởi các yêu cầu HTTP-GET đơn giản từ trình duyệt. Những nội dung này phải được phục vụ như hiện trạng. Điều này sẽ làm cho miền của bạn trở nên vô dụng. Điều này không thể thực hiện được bằng cấu hình máy chủ web. Http là hoàn toàn nhà nước-ít và các máy chủ web không có ý tưởng về các cookie ở tất cả. Cookie được viết hoặc gửi cho khách hàng thông qua các tập lệnh phía máy chủ. Điều tốt nhất bạn có thể làm là tắt tính năng asp.net, classic-asp hoặc php script trên ứng dụng IIS.

Cách chúng tôi thực hiện.

Chúng tôi có thiết lập tên miền phụ để phân phối tài nguyên ít cookie hơn. Vì vậy, chúng tôi lưu trữ tất cả hình ảnh và tập lệnh của chúng tôi trên miền phụ.và từ ứng dụng chính, chúng tôi chỉ trỏ tài nguyên theo url của nó. Chúng tôi đảm bảo rằng miền phụ vẫn không có cookie bằng cách không phân phối bất kỳ tập lệnh động nào trên miền đó hoặc bằng cách tạo bất kỳ phiên asp.net hoặc php nào.

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

từ tên miền chính chúng tôi chỉ tham chiếu tài nguyên như sau.

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

Cảm ơn câu trả lời của bạn, nhưng như đã nêu trước đây, chúng tôi đã thực hiện chính xác giống như bạn và chúng tôi đang nhận cookie do ASP.NET đặt chứ không phải ứng dụng của chúng tôi. Ví dụ: "ASPXANONYMOUS". –

+0

Bạn có đang phục vụ tài nguyên của mình từ bất kỳ HttpHandler nào hoặc bạn có tệp global.asax trong miền ít cookie không? –

+0

Tôi khuyên bạn nên xóa tất cả cookie khỏi trình duyệt. chỉ đặt một vài tài nguyên hình ảnh trên miền và thử gọi nó từ một trang html. Tôi chắc chắn nó sẽ không có cookie. –

0

Nếu bạn không sử dụng cookie, trong bất kỳ cách nào, bạn chỉ có thể vô hiệu hóa trạng thái phiên trong IIS 6: http://support.microsoft.com/kb/244465

Trong IIS, hãy vào tab Home Directory, sau đó nhấp vào " Nút cấu hình ".

Tiếp theo, hãy chuyển đến tab Tùy chọn và bỏ chọn "Bật trạng thái phiên". Cookie sẽ biến mất và bạn có thể để các tệp của mình ở nơi mà chúng không cần thêm miền hoặc phụ kiểm tra.

Ngoài ra, bằng cách sử dụng các tên miền bổ sung, bạn tăng số lần tra cứu dns, điều này phần nào đánh bại mục đích tối ưu hóa tổng thể.

24

Đây là cách tôi đã thực hiện trong trang web của tôi:

  1. Thiết lập một trang web trên IIS với bể bơi ứng dụng ASP.NET
  2. Đặt máy chủ liên kết với your.domain.com
    • Lưu ý: bạn có thể không sử dụng domain.com hoặc người nào khác sub-domain sẽ không cookie
  3. Tạo một thư mục trên trang web gọi là Static
  4. Thiết lập một trang web khác, trỏ đến Static thư mục được tạo trước đó.
  5. Đặt máy chủ liên kết với static.domain.com
  6. Sử dụng bể bơi ứng dụng với mã unmanaged
  7. Trên các thiết lập mở phiên Nhà nước và kiểm tra Not enabled.

Bây giờ bạn có một trang web tĩnh. Để thiết lập mở file web.config dưới Static thư mục và thay thế bằng cái này:

<?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> 

này đang xảy ra để cache các file trong vòng 30 ngày, loại bỏ một RoleManager (Tôi không biết nếu nó thay đổi bất cứ điều gì nhưng tôi loại bỏ tất cả Tôi có thể tìm) và xóa một mục khỏi Tiêu đề phản hồi.

Nhưng đây là một vấn đề, nội dung của bạn sẽ được lưu trữ ngay cả khi một phiên bản mới được triển khai, vì vậy để tránh điều này tôi đã thực hiện một phương pháp trợ giúp cho MVC. Về cơ bản bạn phải nối thêm một số QueryString sẽ thay đổi mỗi lần bạn thay đổi các tệp này.

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

phương pháp MVC của tôi trở nên ngày ghi cuối cùng và gắn thêm vào url file:

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); 
} 

Và để sử dụng nó (MVC3 Razor):

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

Nếu bạn đang sử dụng một loại ứng dụng khác mà bạn có thể làm tương tự, tạo một phương thức để thêm HtmlLink trên trang.

2

Cung cấp tài nguyên từ các miền ít cookie là kỹ thuật tuyệt vời nếu bạn có nhiều hơn 5 hình ảnh/stylehees/javascript được kết hợp thì lợi ích của nó là đáng chú ý và đạt được ngay cả với tra cứu DNS bổ sung đó. Ngoài ra nó rất dễ thực hiện :). Có làm thế nào bạn có thể dễ dàng thiết lập nó trong web.config [system.web] và khai báo tên miền phụ hoàn toàn không cookie (trừ khi nó cookie fested bởi Google Analytics nhưng thats dễ dàng chữa được cũng) :)

<!-- anonymousIdentification configuration: 
        enabled="[true|false]"        Feature is enabled? 
        cookieName=".ASPXANONYMOUS"       Cookie Name 
        cookieTimeout="100000"        Cookie Timeout in minutes 
        cookiePath="/"          Cookie Path 
        cookieRequireSSL="[true|false]"      Set Secure bit in Cookie 
        cookieSlidingExpiration="[true|false]"    Reissue expiring cookies? 
        cookieProtection="[None|Validation|Encryption|All]" How to protect cookies from being read/tampered 
        domain="[domain]"         Enables output of the "domain" cookie attribute set to the specified value 
       --> 

Để cung cấp cho bạn ví dụ

<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain="www.domain." /> 

Điều này sẽ đặt .ASPXANONYMOUS cookie chỉ trên www.domain.anyTLD nhưng không phải tạo hồ bơi và nội dung mới :).