【问题标题】:Stopping cookies being set from a domain (aka "cookieless domain") to increase site performance停止从域(又称“无 cookie 域”)设置 cookie 以提高站点性能
【发布时间】:2011-03-04 21:32:40
【问题描述】:

我在Google's documentation 中阅读有关提高网站速度的信息。他们的建议之一是提供来自“无 cookie 域”的静态内容(图像、css、js 等):

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

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

为 提供静态内容,注册一个新的 域名并配置您的 DNS 具有 CNAME 记录的数据库 将新域指向您现有的域 域 A 记录。配置您的网站 服务器提供静态资源 新域,并且不允许任何 cookie 设置在任何地方 领域。在您的网页中,参考 URL 中的域名 静态资源。

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

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

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

谢谢。

【问题讨论】:

    标签: asp.net cookies windows-server-2008 iis-7.5


    【解决方案1】:

    如果您不从域中写入 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" />
    

    【讨论】:

    • 感谢您的回答,但如前所述,我们所做的与您完全相同,我们获取的是由 ASP.NET 设置的 cookie,而不是我们的应用程序。例如,“ASPXANONYMOUS”。
    • 您是从任何 HttpHandler 提供资源,还是在您的无 cookie 域中有 global.asax 文件?
    • 我建议清除浏览器中的所有 cookie。仅在域上放置少量图像资源并尝试从 html 页面调用它。我敢肯定它不会有 cookie。
    • 另外确保您已经创建了一个单独的域,并且在主域下没有虚拟目录应用程序。
    • 另一件重要的事情是确保您的静态域的应用程序池设置为“无托管代码”。否则你会收到烦人的 ASPXANONYMOUS cookie。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      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 方法获取最后写入日期并附加到文件 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 的方法。

      【讨论】:

        【解决方案4】:

        如果您拥有超过 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 ...无需创建新的池和东西 :)。

        【讨论】:

          猜你喜欢
          • 2010-10-31
          • 2015-11-16
          • 2020-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 2016-02-12
          • 1970-01-01
          相关资源
          最近更新 更多