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

Chu*_*utt 23 asp.net cookies windows-server-2008 iis-7.5

我正在阅读谷歌关于提高网站速度的文档.他们的一个建议是从"无cookie域"提供静态内容(图像,css,js等):

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

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

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

这是非常直接的东西,除了它说" 配置你的web服务器从新域提供静态资源,并且不允许在这个域的任何地方设置任何cookie "的位.根据我的阅读,IIS中没有允许您说"提供静态资源"的设置,那么如何阻止ASP.NET在这个新域上设置cookie?

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

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

谢谢.

Bru*_*oLM 24

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

  1. 使用ASP.NET应用程序池在IIS上设置网站
  2. 将绑定主机设置为 your.domain.com
    • 注意:您不能使用domain.com或者子域不会是无cookie的
  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>
Run Code Online (Sandbox Code Playgroud)

这将缓存文件30天,删除一个RoleManager(我不知道它是否改变了什么,但我删除了所有我找到的),并从响应标题中删除一个项目.

但这是一个问题,即使部署了新版本,您的内容也会被缓存,所以为了避免这种情况,我为MVC制作了一个帮助方法.基本上你必须附加一些QueryString,每次更改这些文件时都会更改.

default.css?v=1   ?v=2  ...
Run Code Online (Sandbox Code Playgroud)

我的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);
}
Run Code Online (Sandbox Code Playgroud)

并使用它(MVC3 Razor):

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

如果您正在使用其他类型的应用程序,则可以执行相同的操作,创建一种方法以在页面上附加HtmlLink.


thi*_*eek 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
Run Code Online (Sandbox Code Playgroud)

从主域我们只是引用资源如下.

<img src="http://cf.mydomain.com/resources/images/logo.png" />
Run Code Online (Sandbox Code Playgroud)