2010-06-17 13 views
23

Estaba leyendo en Google's documentation acerca de cómo mejorar la velocidad del sitio. Una de sus recomendaciones es servir contenido estático (imágenes, CSS, JS, etc.) a partir de un "dominio sin cookies":Dejar de establecer cookies desde un dominio (también conocido como "dominio sin cookies") para aumentar el rendimiento del sitio

El contenido estático, como imágenes, JS y archivos CSS, no necesitan ser acompañado de cookies, ya que hay interacción del usuario con estos recursos . Puede disminuir la latencia solicitud al proporcionar recursos estáticos desde un dominio que no sirve cookies .

Google dice entonces que la mejor manera de hacerlo es comprar un nuevo dominio y configurarlo para que apunte a su actual uno:

para reservar un dominio sin cookies para servir contenido estático, regístrese un nuevo nombre de dominio y configure su base de datos DNS con un registro CNAME que apunta el nuevo dominio al registro de dominio A existente. Configure su servidor web para que brinde recursos estáticos desde el el nuevo dominio, y no permita que se establezcan cookies en ningún lado en este dominio . En sus páginas web, consulte el nombre de dominio en las URL para los recursos estáticos .

Esto es algo bastante sencillo, excepto por la parte en que dice que "configurar el servidor Web para servir recursos estáticos del nuevo dominio, y no permiten ninguna cookie que se establezcan en cualquier parte de este dominio ". From what I've read, no hay ninguna configuración en IIS que le permita decir "servir recursos estáticos", entonces, ¿cómo evito que ASP.NET establezca cookies en este nuevo dominio?

Actualmente, incluso si solo estoy solicitando un archivo .jpg del nuevo dominio, establece una cookie en mi navegador, aunque las cookies de nuestra aplicación estén configuradas en nuestro dominio anterior. Por ejemplo, ASP.NET establece una cookie ".ASPXANONYMOUS" que (hasta donde yo sé) no le estamos diciendo que haga.

Disculpa, si esta es una pregunta nueva, ¡soy nuevo en esto!

Gracias.

Respuesta

16

Si no escribe cookies del dominio, el dominio no tendrá cookies.

Cuando el dominio está configurado para albergar solo contenido de recursos como scripts, imágenes, etc., son solicitados por solicitudes simples HTTP-GET de los navegadores. Estos contenidos deben ser servidos tal como son. Esto hará que su dominio no tenga cookies. Esto no se puede hacer mediante la configuración del servidor web. Http es completamente sin estado y los servidores web no tienen ninguna idea sobre las cookies en absoluto. Las cookies se escriben o se envían a los clientes a través de scripts del lado del servidor. Lo mejor que puede hacer es desactivar las capacidades de asp.net, classic-asp o php en la aplicación IIS.

La forma en que lo hacemos es.

Tenemos una configuración de subdominio para servir recursos sin cookies. Así que alojamos todas nuestras imágenes y scripts en el subdominio.y desde la aplicación principal, simplemente señalamos el recurso por su url. Nos aseguramos de que el subdominio permanezca libre de cookies al no servir ninguna secuencia de comandos dinámica en ese dominio o al crear cualquier sesión asp.net o php.

http://cf.mydomain.com/resources/images/*.images 
http://cf.mydomain.com/resources/scripts/*.scripts 
http://cf.mydomain.com/resources/styles/*.styles 

del dominio principal que acabamos de referir un recurso como siguiendo.

<img src="http://cf.mydomain.com/resources/images/logo.png" /> 
+0

Gracias por su respuesta, pero como se dijo anteriormente, hemos hecho exactamente lo mismo que usted y estamos obteniendo cookies establecidas por ASP.NET, no por nuestra aplicación. Por ejemplo, "ASPXANONYMOUS". –

+0

¿Está sirviendo sus recursos desde cualquier HttpHandler o tiene un archivo global.asax en su dominio sin cookies? –

+0

Sugiero borrar todas las cookies del navegador. ponga solo unos pocos recursos de imagen en el dominio e intente llamarlo desde una página html. Estoy seguro de que no tendrá cookies. –

0

Si no está utilizando esa galleta, de ninguna manera, sólo podría deshabilitar el estado de sesión en IIS 6: http://support.microsoft.com/kb/244465

En IIS, vaya a la ficha Directorio principal, a continuación, haga clic en el " Botón de configuración ".

A continuación, vaya a la pestaña Opciones y desmarque "Habilitar estado de sesión". La cookie desaparecerá, y puede dejar sus archivos donde están sin necesidad de un dominio adicional o sub-doamin.

Además, al usar dominios adicionales, aumenta las búsquedas de DNS, lo que en parte frustra el objetivo de la optimización general.

24

Ésta es la forma en que he hecho en mi página web:

  1. configurar un sitio web de IIS con un grupo de aplicaciones ASP.NET
  2. Establecer el anfitrión unión a your.domain.com
    • Nota: No se puede domain.com utilizar o bien el subdominio no será sin cookies
  3. crear una carpeta en el sitio web llamado Static
  4. Configure otro sitio web, apúntelo a la carpeta Static creada anteriormente.
  5. establecer el host de unión a static.domain.com
  6. Utilizar un grupo de aplicaciones con código no administrado
  7. En la configuración abierta estado de sesión y comprobar Not enabled.

Ahora tiene un sitio web estático. Para configurar abrir el archivo web.config bajo Static carpeta y reemplazar con éste:

<?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> 

Esto va a almacenar en caché los archivos durante 30 días, quitar un roleManager (no sé si se cambia nada, pero me quita todo Pude encontrar) y eliminar un elemento de los Encabezados de respuesta.

Pero aquí hay un problema, su contenido se almacenará en caché incluso cuando se implementa una nueva versión, así que para evitar esto hice un método de ayuda para MVC. Básicamente, debes agregar algo de QueryString que cambiará cada vez que cambies estos archivos.

default.css?v=1 ?v=2 ... 

Mi método MVC tiene la última fecha de escritura y añade en el archivo 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); 
} 

Y utilizarla (MVC3 Razor):

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

Si Si está usando otro tipo de aplicación, puede hacer lo mismo, haga un método para agregar HtmlLink en la página.

2

Servir recursos de dominios sin cookies es una gran técnica si tiene más de 5 de imágenes combinadas/styleshees/javascript, entonces su beneficio es notable y se obtiene incluso con esa búsqueda DNS adicional. También es muy fácil de implementar :). Hay cómo se puede configurar fácilmente en web.config [system.web] y tienen subdominio completamente sin cookies (a menos que su cookie de fested por Google Analytics, pero eso es fácilmente curables también) :)

<!-- 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 
       --> 

Para darle ejemplo

<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain="www.domain." /> 

Esto establecerá cookies .ASPXANONYMOUS sólo en www.domain.anyTLD pero no myStatic.domain.anyTLD ... no hay necesidad de crear nuevas piscinas y otras cosas :).

Cuestiones relacionadas