De acuerdo con las mejores prácticas de Yahoo para sitios web de alto rendimiento , me gustaría eliminar Etags de mis encabezados (estoy administrando manualmente todo mi almacenamiento en caché y no necesito Etags ... y cuándo / si necesito escalar a una granja, Realmente me gustaría que se fueran). Estoy ejecutando IIS7 en Windows Server 2008. ¿Alguien sabe cómo puedo hacer esto?
83
Respuestas:
En IIS7, el número de cambio de Etag (la parte de Etag siguiente :) siempre se establece en 0.
Por lo tanto, el Etag del servidor ya no varía de un servidor a otro para el mismo archivo y, por lo tanto, las mejores prácticas de Yahoo ya no se aplican realmente.
Dado que en realidad no puede suprimir el encabezado ETag en IIS7, probablemente sea mejor que no juegue con él en absoluto. He descubierto que, con mucho, la regla de configuración más útil es "Si el valor predeterminado no rompe algo, déjelo en paz".
fuente
Pensaría que hacer esto en web.config funcionaría para deshabilitar ETags en IIS7. Pero el rastro del rastreador confirma que ETag se envía de todos modos.
<httpProtocol> <customHeaders> <remove name="ETag" /> </customHeaders> </httpProtocol>
El uso de espacios en blanco tampoco funciona. ETag se envía de todos modos.
<httpProtocol> <customHeaders> <add name="ETag" value="" /> </customHeaders> </httpProtocol>
Configurar el ETag en comillas en blanco como han sugerido otros sitios no funciona.
<httpProtocol> <customHeaders> <add name="ETag" value="""" /> </customHeaders> </httpProtocol>
Hace que se envíen aún más ETag:
En conclusión, nada de lo que pueda probar o pensar funciona para matar ETag en IIS7, al menos sin escribir módulos personalizados, etc.
fuente
Escribí un módulo http personalizado para manejar esto. Realmente no es tan malo como parece. Aquí está el código:
using System; using System.Web; namespace StrongNamespace.HttpModules { public class CustomHeaderModule : IHttpModule { public void Init(HttpApplication application) { application.PostReleaseRequestState += new EventHandler(application_PostReleaseRequestState); } public void Dispose() { } void application_PostReleaseRequestState(object sender, EventArgs e) { HttpContext.Current.Response.Headers.Remove("Server"); HttpContext.Current.Response.Headers.Remove("X-AspNet-Version"); HttpContext.Current.Response.Headers.Remove("ETag"); } } }
Aquí están los cambios de web.config que querrá:
<configuration> <system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By"/> </customHeaders> </httpProtocol> <modules> <add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule"/> </modules> </system.webServer> </configuration>
fuente
Me doy cuenta de que esta es una pregunta antigua, pero la encontré mientras buscaba una solución. Creo que encontré una respuesta razonable que publiqué para esta pregunta .
fuente
Tuvimos este problema, e incluso configurar un encabezado ETag personalizado en blanco en IIS 7 no funcionaba para todos los archivos (por ejemplo, archivos de imagen). Terminamos creando un HttpModule que elimina explícitamente el encabezado ETag.
fuente
ACTUALIZACIÓN: se agregó el requisito del módulo de reescritura de URL gracias al usuario @ChrisBarr
En iis 6 es fácil, puede agregar un encabezado personalizado para 'ETag' = ""
En IIS 7, después de leer este hilo y pensar que era imposible sin usar un módulo http personalizado, descubrí que simplemente puede instalar el módulo de reescritura de URL de Microsoft y agregar una regla de reescritura de salida de la siguiente manera:
<outboundRules> <rule name="Remove ETag"> <match serverVariable="RESPONSE_ETag" pattern=".+" /> <action type="Rewrite" value="" /> </rule> </outboundRules>
Esto realmente funciona, y no necesita un módulo http personalizado (dll). Desbloquear la sección de configuración system.webServer y configurar customHeaders, etc., no funciona, al menos en todos los casos que probé. Una simple regla de reescritura de salida lo hace.
fuente
Por cierto, cuando usas iis8 es simple
<element name="clientCache"> <attribute name="cacheControlMode" type="enum" defaultValue="NoControl"> <enum name="NoControl" value="0" /> <enum name="DisableCache" value="1" /> <enum name="UseMaxAge" value="2" /> <enum name="UseExpires" value="3" /> </attribute> <attribute name="cacheControlMaxAge" type="timeSpan" defaultValue="1.00:00:00" /> <attribute name="httpExpires" type="string" /> <attribute name="cacheControlCustom" type="string" /> <attribute name="setEtag" type="bool" defaultValue="true" /> </element>
IIS 8.0: usar o no usar ETag
fuente
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ tiene una bonita guía ilustrada.
Básicamente, crea un encabezado de respuesta personalizado llamado ETag y deja su valor vacío.
fuente
Consulte esta publicación de blog sobre cómo eliminar completamente el encabezado http de Etag en iis6, iis7 e iis7.5
http://lightspeednow.com/blog/2010/05/21/iis-tutorial-how-to-completely-remove-etags-entity-tags-from-iis6-iis7-and-iis7-5/
fuente
Usé el
removeetag.dll
encontrado en http://www.caspianit.co.uk/iis7-etag-problem/ y funcionó perfectamente.Espero que funcione bien para ti también
fuente
En IIS 7, ya no debería tener que preocuparse por etags, ya que el número de configuración de IIS siempre se establece en 0.
Todavía hay un problema si tiene servidores web IIS6 e IIS7 en la misma granja. En este caso, tendría que establecer manualmente el número de configuración de IIS6 en 0 como se describe en este artículo .
Las etiquetas electrónicas son realmente muy útiles ya que no es necesario cambiar el nombre del archivo como lo hace el desbordamiento de pila (es decir, default.css? 1234). Si cambia el archivo default.css, cambiará el etag y, por lo tanto, las solicitudes posteriores obtendrán el archivo del servidor y no del caché.
fuente
Creo que esto funcionará ... Sé que eliminar y en blanco no funciona.
<configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="ETag" value=" " /> </customHeaders> </httpProtocol> </configuration> </system.webServer>
fuente