阻止从一个域名设置cookie(也称为“无cookie域”),以提高网站性能

24

我正在阅读Google的文档,了解如何提高网站速度。他们的建议之一是从“无cookie域”提供静态内容(图像、css、js等):

静态内容,例如图像、JS和 CSS文件,不需要携带 cookie,因为这些 资源与用户没有交互。您可以通过从不提供 cookie的域中提供静态资源来减少请求 延迟。

然后Google说,最好的方法是购买一个新域名并将其设置为指向您当前的域名:

为了保留无cookie域以提供静态内容,请注册一个新 域名,并使用CNAME记录配置您的DNS 数据库,将新域名指向现有的域名A记录。 配置您的Web服务器以从新域名提供静态资源, 并且不要在此域上设置任何cookie。在您的Web页面中, 引用该域名的URL以获取静态资源。

这是相当直接的内容,除了其中提到“配置您的Web服务器以从新域名提供静态资源,并且不允许在此域上设置任何Cookie”的部分。据我所知, IIS 中没有允许您说“提供静态资源”的设置,那么我该如何防止 ASP.NET 在这个新域上设置 Cookie?
目前,即使我只是从新域请求 .jpg,它也会在我的浏览器上设置一个 Cookie,尽管我们应用程序的 Cookie 已经设置为旧域名。例如,ASP.NET 设置了一个“.ASPXANONYMOUS”Cookie,我们(据我所知)没有告诉它要这样做。
如果这是真正的新手问题,请谅解,我对此还很陌生!
谢谢。
4个回答

25

这是我在我的网站上所使用的方法:

  1. 在IIS上设置一个ASP.NET应用程序池的网站
  2. 将绑定主机设置为your.domain.com
    • 注意:不能使用domain.com,否则子域名将无法去除cookie。
  3. 在网站上创建一个名为Static的文件夹
  4. 设置另一个网站,并将其指向之前创建的Static文件夹。
  5. 将绑定主机设置为static.domain.com
  6. 使用带有非托管代码的应用程序池
  7. 在设置中打开“会话状态”,并勾选“未启用”。

现在您拥有了一个静态网站。要进行设置,请打开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创建了一个帮助方法。基本上,您必须附加一些查询字符串,每当更改这些文件时,它们就会发生变化。

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附加到页面上。


17

如果您不对域名编写cookie,则该域名将成为无cookie。

当将域设置为仅托管资源内容,例如脚本、图像等时,它们是由浏览器通过普通的HTTP-GET请求请求的。这些内容应按原样提供。这将使您的域无cookie。这不能通过Web服务器配置完成。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" />

你是从任何HttpHandler提供资源还是在无cookie域中有global.asax文件? - this. __curious_geek
我建议清除浏览器中的所有Cookie。只在域上放置少量图像资源,并尝试从HTML页面调用它。我相信它将是无Cookie的。 - this. __curious_geek
1
还要确保您创建了一个完全独立的域,而不是在主域下创建虚拟目录应用程序。 - this. __curious_geek
1
另一个重要的事情是确保您的静态域的应用程序池设置为“无托管代码”。否则,您将被提供令人讨厌的ASPXANONYMOUS cookie。 - Chuck Le Butt
就像我所说的,如果您不将静态域的AppPool设置为“无托管代码”,则会收到一个ASPXANONYMOUS cookie。 - Chuck Le Butt
显示剩余8条评论

2

如果您有超过5个组合图像/样式表/JavaScript文件,从无Cookie域提供资源是一种很好的技术,其效益是显而易见的,即使增加了额外的DNS查找。而且它非常容易实现:)。以下是如何在web.config [system.web]中轻松设置它,并拥有完全无Cookie的子域(除非被Google Analytics的Cookie污染,但这也很容易治愈):)

<!-- 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." />

这将仅在www.domain.anyTLD上设置.ASPXANONYMOUS cookie,而不会在myStatic.domain.anyTLD上设置...无需创建新的池等 :).

0

如果您没有以任何方式使用那个cookie,您可以在IIS 6中禁用会话状态:

http://support.microsoft.com/kb/244465

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

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

此外,通过使用其他域名,您会增加DNS查找次数,这在一定程度上会削弱整体优化的意图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接