首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止从域(也称为“无cookies域”)设置cookie,以提高站点性能。

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

Stack Overflow用户
提问于 2010-06-17 10:23:09
回答 4查看 20.4K关注 0票数 24

我在Google文档上读到关于提高网站速度的文章。他们的建议之一是提供静态内容(图像、css、js等)。来自“无灶领域”:

静态内容(如图像、JS和CSS文件)不需要附带cookie,因为用户不需要与这些资源进行交互。您可以通过提供来自不提供cookie的域的静态资源来减少请求延迟。

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

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

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

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

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

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-17 10:39:47

如果不从域编写cookie,则域将没有cookie.

当域被设置为只承载脚本、图像等资源内容时,它们是由来自浏览器的普通HTTP-GET请求请求的。这些内容应按原样提供。这将使您的领域无灶。这不能通过web服务器配置来完成.Http是完全无状态的,web服务器根本不知道cookie。Cookie通过服务器端脚本编写或发送给客户端。最好的方法是禁用IIS应用程序上的asp.net、经典-asp或php脚本功能.。

我们的做法是。

我们有一个子域设置,以提供无cookie资源。所以我们把所有的图像和脚本放在子域上。从主要的应用程序中,我们只是通过它的url来指出资源。我们确保子域保持无cookie状态,方法是不在该域上提供任何动态脚本,或者创建任何asp.net或php会话.

代码语言:javascript
复制
http://cf.mydomain.com/resources/images/*.images
http://cf.mydomain.com/resources/scripts/*.scripts
http://cf.mydomain.com/resources/styles/*.styles

从主域,我们只引用一个资源如下。

代码语言:javascript
复制
<img src="http://cf.mydomain.com/resources/images/logo.png" />
票数 17
EN

Stack Overflow用户

发布于 2011-01-30 15:41:54

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

  1. 使用ASP.NET应用程序池在IIS上设置网站
  2. 将绑定主机设置为your.domain.com
    • 注意:您不能使用domain.com,否则子域将不是没有炊具的。

​

  1. 在网站上创建一个名为Static的文件夹
  2. 设置另一个网站,将其指向先前创建的Static文件夹。
  3. 将绑定主机设置为static.domain.com
  4. 使用非托管代码的应用程序池
  5. 在设置上,打开会话状态并检查Not enabled。

现在你有了一个静态网站。若要设置web.config文件,请在Static文件夹下打开并替换为以下文件:

代码语言:javascript
复制
<?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,以便在每次更改这些文件时进行更改。

代码语言:javascript
复制
default.css?v=1   ?v=2  ...

我的MVC方法获取最后的写入日期并附加到文件url上:

代码语言:javascript
复制
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):

代码语言:javascript
复制
<link href="@Url.GetContent("~/static/default.css")" rel="stylesheet" type="text/css" />

如果您正在使用另一种应用程序,您也可以这样做,创建一个在页面上添加HtmlLink的方法。

票数 25
EN

Stack Overflow用户

发布于 2011-03-22 21:37:53

如果您有超过5的组合图像/样式表/javascript,那么它的好处是显而易见的,而且即使有额外的DNS查找,为Cookie无域的资源提供服务也是一项伟大的技术。它也很容易实现:)。您可以轻松地将其设置在web.configsystem.web中,并拥有完全没有烹饪功能的子域(除非Google使用了cookie,但这也很容易治愈) :)

代码语言:javascript
复制
<!-- 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
                -->

给你举个例子

代码语言:javascript
复制
<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上设置.不需要创建新的池和东西:)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3060775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档