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

时间:2010-06-17 10:23:10

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

我正在Google's documentation阅读有关提高网站速度的信息。他们的一个建议是从“无Cookie域”提供静态内容(图片,css,js等):

  

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

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

  

为。保留无Cookie域   提供静态内容,注册新的   域名并配置您的DNS   具有CNAME记录的数据库   将新域指向您现有的域   域名A记录。配置您的网络   服务器来提供静态资源   新域名,不允许任何   饼干可以在任何地方设置   域。在您的网页中,参考   网址中的域名   静态资源。

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

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

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

感谢。

4 个答案:

答案 0 :(得分:24)

这就是我在网站上的表现:

  1. 使用ASP.NET应用程序池在IIS上设置网站
  2. 将绑定主机设置为your.domain.com
    • 注意:您不能使用domain.com,否则子域将不会是无Cookie的
  3. 在名为Static
  4. 的网站上创建一个文件夹
  5. 设置其他网站,将其指向先前创建的Static文件夹。
  6. 将绑定主机设置为static.domain.com
  7. 使用具有非托管代码的应用程序池
  8. 在设置上打开“会话状态”并选中Not enabled
  9. 现在你有一个静态网站。要设置打开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的方法。

答案 1 :(得分:16)

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

答案 2 :(得分:2)

从无Cookie域提供资源是一项很好的技术,如果你有超过5个组合图像/样式/ javascript,那么它的好处是显而易见的,甚至可以获得额外的DNS查找。它也很容易实现:)。你可以在web.config [system.web]中轻松设置它,并拥有完全无cookie的子域名(除非它的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 ......不需要创建新的池和内容:)。

答案 3 :(得分:0)

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

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

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

另外,通过使用其他域,您可以增加dns查找,这部分地违背了整体优化的目的。