24

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

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

然后谷歌表示,最好的方法是购买一个新域并将其设置为指向您当前的域:

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

这是非常直接的东西,除了它说“配置您的 Web 服务器以提供来自新域的静态资源,并且不允许在该域的任何位置设置任何 cookie ”。根据我的阅读,IIS 中没有允许您说“提供静态资源”的设置,那么如何防止 ASP.NET 在这个新域上设置 cookie?

目前,即使我只是从新域请求 .jpg,它也会在我的浏览器上设置一个 cookie,即使我们的应用程序的 cookie 设置为我们的旧域。例如,ASP.NET 设置了一个“.ASPXANONYMOUS”cookie(据我所知)我们并没有告诉它这样做。

抱歉,如果这是一个真正的新手问题,我是新手!

谢谢。

4

4 回答 4

24

这就是我在我的网站上所做的:

  1. 使用 ASP.NET 应用程序池在 IIS 上设置网站
  2. 将绑定主机设置为your.domain.com
    • 注意:您不能使用domain.com,否则子域将不会是 cookieless
  3. 在网站上创建一个文件夹,名为Static
  4. 设置另一个网站,将其指向Static之前创建的文件夹。
  5. 将绑定主机设置为static.domain.com
  6. 使用具有非托管代码的应用程序池
  7. 在设置中打开 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 的方法。

于 2011-01-30T15:41:54.737 回答
17

如果您不从域写入 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" />
于 2010-06-17T10:39:47.913 回答
2

如果您拥有超过 5 个组合图像/样式表/javascript,则从无 Cookie 域提供资源是一种很好的技术,那么它的好处是显而易见的,即使通过额外的 DNS 查找也能获得收益。它也很容易实现:)。您可以轻松地在 web.config[system.web] 中设置它并拥有完全无 cookie 的子域(除非它的 cookie 由 Google Analytics 提供,但也很容易治愈):)

<!-- 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 而不是 myStatic.domain.anyTLD 上设置 .ASPXANONYMOUS cookie ...无需创建新的池和东西:)。

于 2011-03-22T21:37:53.580 回答
0

如果您不使用该 cookie,无论如何,您可以在 IIS 6 中禁用会话状态:http: //support.microsoft.com/kb/244465

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

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

此外,通过使用额外的域,您增加了 dns 查找,这部分违背了整体优化的意图。

于 2010-08-31T08:27:21.367 回答