2010-06-17 58 views
23

我在Google's documentation中阅读了有关提高网站速度的内容。他们的建议之一是从“无Cookie域”提供静态内容(图片,CSS,JS等):停止从域名(也称为“无Cookie域名”)设置Cookie以提高网站性能

静态内容,如图像,JS和CSS 文件,不需要为 伴随着cookie,因为有 没有用户与这些 资源互动。您可以通过向不提供 Cookie的域提供静态资源 来减少请求 延迟。

谷歌则表示,要做到这一点,最好的办法是买一个新的领域,并将其设置为指向当前的一个:

要保留一个cookie的域 提供静态内容,注册一个新的 域名,并配置您的DNS 数据库与CNAME记录 指向新的域到您现有的 域A记录。配置您的网络 服务器以便从 新域中提供静态资源,并且不允许在此 域的任何位置设置任何 Cookie。在您的网页中,请参考 静态资源的URL中的域名。

这是非常简单的东西,除了在那里说为“配置Web服务器从新的领域提供静态资源的位,并且不允许任何cookie随时随地在这个领域设置”。 From what I've read,IIS中没有设置允许您说“提供静态资源”,那么如何防止ASP.NET在这个新域中设置Cookie?

目前,即使我刚刚从新域请求.jpg,即使我们的应用程序的Cookie设置为旧域,它也会在我的浏览器上设置Cookie。例如,ASP.NET设置了一个“.ASPXANONYMOUS”cookie(据我所知),我们没有告诉它做。如果这是一个真正的新问题,我很抱歉,我是新来的!

谢谢。

回答

16

如果您不从域中写入Cookie,则该域名将无cookie。

当域设置为仅托管脚本,图像等资源内容时,它们通过来自浏览器的普通HTTP-GET请求被请求。这些内容应该按原样提供。这将使你的域名无cookie。这不能通过网络服务器配置完成。 Http是完全无状态的,Web服务器根本不了解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" /> 
+0

感谢您的回答,但如前所述,我们已经完成了与您完全相同的操作,并且我们正在获取由ASP.NET设置的Cookie,而不是我们的应用程序。例如,“ASPXANONYMOUS”。 – 2010-06-17 10:56:44

+0

你从任何的HttpHandler服务您的资源,或者你有Global.asax文件在你的cookie的域名? – 2010-06-17 11:01:05

+0

我建议清除浏览器中的所有cookies。只在域上放置少量图像资源,并尝试从HTML页面调用它。我相信这将是无cookie的。 – 2010-06-17 11:05:01

0

如果你不使用该cookie,以任何方式,你可以只禁用会话状态在IIS 6: http://support.microsoft.com/kb/244465

在IIS中,转到主目录选项卡,然后单击“配置“按钮。

接下来转到选项选项卡并取消选中“启用会话状态”。 Cookie将消失,您可以将文件保留在不需要额外域名或子域名的地方。

另外,通过使用其他域,可以增加dns查找,这部分地破坏了整体优化的意图。

24

这是我如何在我的网站做:

  1. 设置在IIS上的网站的ASP.NET应用程序池
  2. 设置绑定主机your.domain.com
    • 注:不能使用domain.com或其他子域不会无Cookie
  3. 在网站上创建一个文件夹Static
  4. 安装另一个网站,将其指向之前创建的Static文件夹。
  5. 设置绑定主机static.domain.com
  6. 使用一个应用程序池与非托管代码
  7. 在设置打开会话状态,并检查Not enabled

现在你有一个静态网站。要设置打开Static文件夹下的文件web.config并将其替换这一个:

<?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方法获取最后写日期和附加的文件网址:

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剃刀):

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

如果您正在使用另一种类似的应用程序,你可以做同样的事情,制作一个在页面上附加HtmlLink的方法。

2

从cookie的域投放的资源是巨大的技术,如果你有超过5个的组合图像/ styleshees/JavaScript代码,然后它的好处是明显的,并且即使有额外的DNS查找增益。也很容易实现:)。还有就是你可以很容易地将它设置在web.config中[System.Web程序],并有完全cookie的子域(除非它由谷歌Analytics(分析)Cookie的fested但那是很容易治愈的一样):)

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

给你例子

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

这将设置.ASPXANONYMOUS饼干只在www.domain.anyTLD但不myStatic.domain.anyTLD ......没必要创建新池和东西:)。