代码之家  ›  专栏  ›  技术社区  ›  Chuck Le Butt

停止从域(也称为“无cookie域”)设置cookie以提高站点性能

  •  23
  • Chuck Le Butt  · 技术社区  · 16 年前

    我在看书 Google's documentation 关于提高网站速度。他们的建议之一是提供来自“无烹饪领域”的静态内容(图像、CSS、JS等):

    静态内容,如图像、JS和 CSS文件,不需要 伴随着饼干 没有用户与这些交互 资源。您可以减少请求 通过服务静态资源的延迟 来自不服务的域 饼干。

    谷歌随后表示,做到这一点的最佳方法是购买一个新的域名,并将其设置为指向您当前的域名:

    为 服务静态内容,注册新的 域名和配置您的DNS 具有CNAME记录的数据库 将新域指向现有域 域A记录。配置您的网络 为静态资源提供服务的服务器 新域,不允许任何 要在此上设置的cookies 领域。在您的网页中,引用 URL中的域名 静态资源。

    这是非常直截了当的东西,除了它所说的那一点。 配置Web服务器以提供来自新域的静态资源,并且不允许在此域上的任何位置设置任何cookie “。 From what I've read ,在IIS中没有允许您说“服务静态资源”的设置,那么如何阻止ASP.NET在此新域上设置cookie?

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

    抱歉,如果这是一个新问题,我是新来的!

    谢谢。

    4 回复  |  直到 12 年前
        1
  •  16
  •   phatskat    12 年前

    如果您不从域中写入cookie,则该域将减少cookie。

    当域设置为仅承载资源内容(如脚本、图像等)时,浏览器的纯HTTP-GET请求将请求这些内容。这些内容应按原样提供。这将使您的域无需烹饪。这不能由Web服务器配置完成。HTTP完全没有状态,Web服务器根本不知道cookie。cookie是通过服务器端脚本写入或发送到客户机的。 最好的方法是在IIS应用程序上禁用ASP.NET、经典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" />
    
        2
  •  24
  •   BrunoLM    15 年前

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

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

    现在你有了一个静态网站。要设置,请打开 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天,删除一个角色管理器(我不知道它是否会改变任何东西,但我删除了所有我能找到的),并从响应头中删除一个项目。

    但这里有一个问题,即使部署了新版本,您的内容也会被缓存,所以为了避免这种情况,我为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剃须刀):

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

    如果您使用的是其他类型的应用程序,您也可以这样做,请创建一个在页面上附加htmllink的方法。

        3
  •  2
  •   Xeevis    15 年前

    从无cookie的域中提供资源是一项伟大的技术,如果您有超过5个组合的图像/样式/javascript,那么它的好处是显而易见的,即使使用额外的DNS查找也会得到好处。而且很容易实现:)。你可以很容易地在web.config[system.web]中设置它,并拥有完全无需烹饪的子域(除非它的cookie被google分析所感染,但也很容易治愈):)

    <!-- 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…不需要创建新的池和内容:)。

        4
  •  0
  •   Lonnie Best    16 年前

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

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

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

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

    推荐文章