我正在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(就我所知),我们并没有告诉它。
道歉,如果这是一个真正的新问题,我是新来的!
感谢。
答案 0 :(得分:24)
这就是我在网站上的表现:
your.domain.com
domain.com
,否则子域将不会是无Cookie的Static
Static
文件夹。static.domain.com
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>
这将缓存文件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查找,这部分地违背了整体优化的目的。