¿Cómo elimino los encabezados eTag de IIS7?

83

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?

Jeff Atwood
fuente
Funciona para IIS 8.0 en adelante, al menos como se muestra en la segunda respuesta de esta publicación: stackoverflow.com/questions/7947420/…
RBT

Respuestas:

39

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".

AnthonyWJones
fuente
2
Me siento tentado a matar a los etags por una razón diferente: a menos que esté malinterpretando las cosas, veo que IIS en un solo servidor cambia gratuitamente el primer componente de los etags (es decir, el llamado "Filetimestamp") a pesar de que mi archivo no modificado. Por ejemplo, la última versión de un archivo estará en el navegador, el navegador enviará 'If-None-Match: "01cc3a8acccc1: 0"' / 'If-Modified-Since: Fri, 06 Jan 2012 00:32: 24 GMT ', e IIS responderá con' ETag: "b6baeea8acccc1: 0" '/' Última modificación: viernes 06 de enero de 2012 00:32:24 GMT '. Estos son archivos js con URL como foo.js? Rev = xxx, pasando el mismo xxx cada vez.
Chris
@Chris: Hago casi lo mismo, permito que los archivos js se almacenen en caché y solo cambio el xxx cuando se cambia el archivo. No puedo decir que alguna vez me haya encontrado con el comportamiento que está viendo en cualquier versión de IIS. Algo es un poco extraño con su configuración de IIS, sospecho.
AnthonyWJones
Gracias. Hasta donde usted sabe, ¿la parte de "Filetimestamp" de etags se basa SOLAMENTE en la marca de tiempo del archivo que se solicita y no en nada sobre el estado de la máquina / proceso / aplicación?
Chris
@Chris: Hasta donde yo sé, E-Tag se basa solo en el tiempo del archivo. He intentado jugar con mi servidor y no puedo reproducir el problema que está viendo.
AnthonyWJones
No sé si hacer un servidor no modificable sea una política inteligente. Además. Estoy probando Expires en el futuro lejano y simplemente no quiero una respuesta HTTP 304, nunca. Quiero que las cosas permanezcan en un caché durante muuuucho tiempo, ya que sé que esos activos rara vez cambian. Existe mucha documentación de IETF, incluida la especificación HTTP RFC 2616 que explica que esto puede y debe hacerse como administrador del sitio, ya que esa persona conocerá mucho mejor su situación. Los implementadores siempre están buscando lo que está sucediendo en la "naturaleza".
Josh Robinson
33

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="&quot;&quot;" />
    </customHeaders>
</httpProtocol>

Hace que se envíen 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.

Jeff Atwood
fuente
2
No he confirmado esto, Jeff, pero podría deberse a que la sección httpProtocol está bloqueada en el nivel del sitio web. Encontré que este era el caso cuando intentaba establecer programáticamente el nivel de compresión iis7 a través del archivo web.config. Finalmente tuve que desbloquear esa sección en el nivel del servidor raíz. ¿Quizás esta sección tiene el mismo problema? (Realmente desearía que TODAS las configuraciones de IIS estuvieran disponibles a través de la GUI)
Pure.Krome
1
@ Pure.Krome: El desbloqueo, combinado con el segundo intento anterior de Jeff, parece funcionar para mí en la mayoría de los casos ... excepto (¡por supuesto!) Para el contenido de la imagen. : - \ <sectionGroup name = "system.webServer"> <section name = "httpProtocol" overrideModeDefault = "Allow" /> </sectionGroup> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag" value = "" /> </customHeaders> </httpProtocol> Así que al menos parece haber una solución parcial aquí.
jerhewet
@jer debería agregar eso como una respuesta adecuada
Jeff Atwood
1
@jerhewet no funciona para mí (Windows Server 2008 R2, IIS 7.5)
sinelaw
1
Donde todas las demás soluciones fallaron o no fueron factibles de implementar para mí, funcionó una regla de reescritura simple. Vea mi respuesta: stackoverflow.com/a/18025228/705198
AndrewPK
22

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>
Dan
fuente
1
+1, sin embargo, esto solo parece cubrir los recursos solicitados al sitio web, no cosas como favicons
Brad
13

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 .

Nathan Fox
fuente
confirmado que funciona siempre que borre su caché después de cambiarlo;)
peter3
7

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.

jwanagel
fuente
6

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.

AndrewPK
fuente
1
Sin embargo, esta solución requiere que este módulo personalizado se instale en IIS, ¿correcto?
CBarr
@ChrisBarr sí, lo siento, no lo mencioné. Respuesta actualizada.
AndrewPK
4

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

JeffZhnn
fuente
2

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/

Brian
fuente
2
Eso requiere un complemento de terceros llamado Helicon Ape. Realmente necesitamos una solución que utilice la configuración nativa de IIS, no un complemento adicional. Esto es especialmente cierto para cualquier granja web a gran escala, que es exactamente donde ETag es el mayor problema.
Keith
1

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é.

Alex
fuente
7
Las fechas de vencimiento lejanas hacen que los ETags sean irrelevantes, ya que el navegador nunca volverá a solicitar el archivo hasta la fecha especificada (o hasta que cambie el nombre del archivo, por supuesto). Por lo tanto, la necesidad de eliminarlo, es obsoleto en ese escenario.
Jeff Atwood
3
@JeffAtwood no es estrictamente cierto, el navegador solicitará el archivo si el usuario presiona el botón de actualización, si el etag es el mismo, obtiene un 304 si la diferencia obtiene un 200, el problema aquí es que envía 2 encabezados donde 1 lo haría han sido suficientes
Sam Saffron
1

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>
Md. Alim Ul Karim
fuente