asp.net iis-7 etag

asp.net - ¿Cómo elimino los encabezados de eTag de IIS7?



iis-7 (12)

Según las mejores prácticas de Yahoo para sitios web de alto rendimiento , me gustaría eliminar Etags de mis encabezados (estoy administrando manualmente todo el 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?



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>


En IIS 7 ya no tendrá que preocuparse por los etags ya que el número de configuración de IIS siempre se establece en 0.

Todavía hay un problema si tiene los servidores web IIS6 e IIS7 en la misma granja de servidores. En este caso, deberá establecer manualmente el número de configuración de IIS6 en 0, como se describe en este article .

Los Etags 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 subsiguientes obtendrán el archivo del servidor y no del caché.


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 servidor a servidor para el mismo archivo y, por lo tanto, las mejores prácticas de Yahoo ya no se aplican realmente.

Como no se puede suprimir el encabezado de ETag en IIS7, probablemente sea mejor que no lo toque. Descubrí que la regla de configuración más útil es "Si el valor predeterminado no rompe algo, déjalo en blanco".


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>


Me doy cuenta de que esta es una vieja pregunta, pero me encontré con ella mientras buscaba una solución. Creo que encontré una respuesta razonable que publiqué para esta pregunta .


Pensarías que hacer esto en la web.config funcionaría para deshabilitar ETags en IIS7. Pero sniffer trace confirma que ETag se envía de todos modos.

<httpProtocol> <customHeaders> <remove name="ETag" /> </customHeaders> </httpProtocol>

Usar el espacio en blanco tampoco funciona. ETag se envía de todos modos.

<httpProtocol> <customHeaders> <add name="ETag" value="" /> </customHeaders> </httpProtocol>

Establecer ETag a citas en blanco como otros sitios han sugerido no funciona.

<httpProtocol> <customHeaders> <add name="ETag" value="&quot;&quot;" /> </customHeaders> </httpProtocol>

Provoca que se envíe aún más ETag:

ETag: "8ee1ce1acf18ca1:0",""

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.


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: para usar o no usar ETag


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.




ACTUALIZACIÓN: requisito de módulo de reescritura de URL añadido 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 de imaginar que era imposible sin utilizar 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 de system.webServer y configurar CustomHeaders, etc., no funciona, al menos en todos los casos que probé. Una regla de reescritura de salida simple sí lo hace.