Como faço para remover cabeçalhos eTag do IIS7?


83

De acordo com as práticas recomendadas do Yahoo para sites de alto desempenho , gostaria de remover Etags de meus cabeçalhos (estou gerenciando manualmente todo o meu cache e não tenho necessidade de Etags ... e quando / se eu precisar escalar para um farm, Eu realmente gostaria que eles fossem). Estou executando o IIS7 no Windows Server 2008. Alguém sabe como posso fazer isso?


Funciona para IIS 8.0 em diante, pelo menos conforme mostrado na segunda resposta deste post: stackoverflow.com/questions/7947420/…
RBT

Respostas:


39

No IIS7, o número de alteração de Etag (a parte seguinte de Etag:) é sempre definido como 0.

Portanto, a Etag do servidor não varia mais de servidor para servidor para o mesmo arquivo e, portanto, a prática recomendada do Yahoo não se aplica mais.

Como você não pode realmente suprimir o cabeçalho ETag no IIS7, provavelmente seria melhor que você não mexesse nele. Eu descobri que a regra de configuração mais útil é "Se o padrão não quebrar algo, deixe como está".


2
Estou tentado a matar etags por um motivo diferente: a menos que eu esteja interpretando mal as coisas, estou vendo o IIS em um único servidor alterar gratuitamente o primeiro componente de etags (ou seja, o chamado "Filetimestamp"), apesar de meu arquivo não ser modificado. Por exemplo, a versão mais recente de um arquivo estará no navegador, o navegador enviará 'If-None-Match: "01cc3a8acccc1: 0"' / 'If-Modified-Since: Fri, 06 Jan 2012 00:32: 24 GMT ', e o IIS responderá com' ETag: "b6baeea8acccc1: 0" '/' Última modificação: Sex, 06 de janeiro de 2012 00:32:24 GMT '. Esses são arquivos js com URLs como foo.js? Rev = xxx, passando o mesmo xxx a cada vez.
Chris

@Chris: Eu faço quase a mesma coisa, permito que os arquivos js sejam armazenados em cache e só altero o xxx quando o arquivo é alterado. Não posso dizer que já encontrei o comportamento que você está vendo em qualquer versão do IIS. Suspeito que algo está um pouco estranho com a configuração do IIS.
AnthonyWJones

Obrigado. Até onde você sabe, a parte "Filetimestamp" de etags é baseada SOMENTE no carimbo de data / hora do arquivo que está sendo solicitado, e não em nada sobre o estado da máquina / processo / aplicativo?
Chris

@Chris: Pelo que eu sei sim, a E-Tag é baseada apenas na hora do arquivo. Tentei mexer no meu servidor e não consigo reproduzir o problema que você está vendo.
AnthonyWJones

Não sei se tornar um servidor não modificável é uma política sensata. Além disso. Estou testando expira em um futuro distante e simplesmente não quero uma resposta HTTP 304 - nunca. Quero que as coisas fiquem em um cache por muuuuito tempo, pois sei que esses ativos raramente mudam. Há muita documentação IETF por aí, incluindo a especificação HTTP RFC 2616 que explica isso pode e deve ser feito como um administrador de site, pois essa pessoa conhecerá sua situação muito melhor. Os implementadores estão sempre procurando o que está acontecendo na "selva".
Josh Robinson

33

Você pensaria que fazer isso no web.config funcionaria para desabilitar ETags no IIS7. Mas o rastreamento do farejador confirma que a ETag foi enviada de qualquer maneira.

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

Usar o branco também não funciona. A ETag é enviada de qualquer maneira.

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

Definir a ETag para aspas em branco, conforme sugerido por outros sites, não funciona.

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

Faz com que ainda mais ETag seja enviada:

ETag: "8ee1ce1acf18ca1: 0", ""

Concluindo, nada que eu possa tentar ou pensar funciona para matar ETag no IIS7, pelo menos sem escrever módulos personalizados, etc.


2
Eu não confirmei isso Jeff, mas pode ser porque a seção httpProtocol está bloqueada no nível do site. Descobri que esse era o caso quando estava tentando definir programaticamente o nível de compactação iis7 por meio do arquivo web.config. Eu tive que finalmente desbloquear essa seção no nível do servidor raiz. Talvez esta seção tenha o mesmo problema? (Eu realmente gostaria que TODAS as configurações do IIS estivessem disponíveis por meio da GUI)
Pure.Krome

1
@ Pure.Krome: O desbloqueio, combinado com a segunda tentativa de Jeff acima, parece funcionar para mim na maioria dos casos ... exceto (é claro!) Para conteúdo de imagem. : - \ <sectionGroup name = "system.webServer"> <section name = "httpProtocol" overrideModeDefault = "Allow" /> </sectionGroup> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag" value = "" /> </customHeaders> </httpProtocol> Portanto, pelo menos parece haver uma solução parcial aqui.
jerhewet,

@jer, você deve adicionar isso como uma resposta adequada
Jeff Atwood,

1
@jerhewet não funciona para mim (Windows Server 2008 R2, IIS 7.5)
sinelaw

1
Onde todas as outras soluções falharam ou não foram viáveis ​​de implementar para mim, uma regra simples de reescrita funcionou. Veja minha resposta: stackoverflow.com/a/18025228/705198
AndrewPK

22

Eu escrevi um módulo http personalizado para lidar com isso. Realmente não é tão ruim quanto parece. Aqui está o 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");
        }
    }
}

Aqui estão as alterações do web.config que você deseja:

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By"/>
            </customHeaders>
        </httpProtocol>
        <modules>
            <add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule"/>
        </modules>
    </system.webServer>
</configuration>

1
+1, no entanto, isso parece cobrir apenas os recursos solicitados ao site, não coisas como favicons
Brad

13

Sei que essa é uma pergunta antiga, mas me deparei com ela enquanto procurava uma solução. Acho que encontrei uma resposta razoável que postei para esta pergunta .


confirmou o funcionamento, desde que você limpe o cache após alterá-lo;)
peter3

7

Tivemos esse problema e mesmo a configuração de um cabeçalho ETag personalizado em branco no IIS 7 não funcionava para todos os arquivos (por exemplo, arquivos de imagem). Acabamos criando um HttpModule que remove explicitamente o cabeçalho ETag.


6

ATUALIZAÇÃO: adicionado requisito de módulo de reconfiguração de URL graças ao usuário @ChrisBarr

No iis 6 é fácil, você pode adicionar um cabeçalho personalizado para 'ETag' = ""

No IIS 7, depois de ler este tópico e descobrir que era impossível sem usar um módulo http personalizado, descobri que você pode simplesmente instalar o módulo de reescrita de URL da Microsoft e adicionar uma regra de reescrita de saída da seguinte maneira:

<outboundRules>
  <rule name="Remove ETag">
    <match serverVariable="RESPONSE_ETag" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

Isso realmente funciona e você não precisa de um módulo http personalizado (dll). Desbloquear a seção de configuração system.webServer e definir customHeaders, etc., não funciona - pelo menos em todos os casos que tentei. Uma regra simples de reescrita de saída sim.


1
No entanto, esta solução requer que este módulo personalizado seja instalado no IIS, correto?
CBarr

@ChrisBarr, sim - desculpe, não falei sobre isso. Resposta atualizada.
AndrewPK

4

A propósito, quando você usa iis8 é simples

<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 ou não usar ETag



2

Confira esta postagem do blog sobre como remover completamente o cabeçalho Etag http em 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/


2
Isso requer um plug-in de terceiros chamado Helicon Ape. Realmente, precisamos de uma solução que use a configuração nativa do IIS, não um plug-in extra. Isso é especialmente verdadeiro para qualquer web farm de grande escala, que é exatamente onde a ETag é o maior problema.
Keith


1

No IIS 7, você não precisa mais se preocupar com etags, pois o número de configuração do IIS está sempre definido como 0.

Ainda há um problema se você tiver servidores da web IIS6 e IIS7 no mesmo farm. Nesse caso, você teria que definir manualmente o número de configuração do IIS6 como 0, conforme descrito neste artigo .

Etags são realmente muito úteis, pois você não precisa alterar o nome do arquivo como o estouro de pilha (ou seja, default.css? 1234). Se você alterar o arquivo default.css, ele mudará a etag e, portanto, as solicitações subsequentes obterão o arquivo do servidor e não do cache.


7
datas de expiração muito avançadas tornam as ETags irrelevantes, uma vez que o navegador literalmente nunca solicitará o arquivo novamente até a data especificada (ou até que o nome do arquivo mude, é claro). Portanto, a necessidade de removê-lo - é obsoleta nesse cenário.
Jeff Atwood

3
@JeffAtwood não é estritamente verdadeiro, o navegador irá solicitar o arquivo se o usuário clicar no botão atualizar, se a etag for a mesma, você obtém 304 se diff obtiver 200, o problema aqui é que você envia 2 cabeçalhos onde 1 seria foram suficientes
Sam Saffron

1

Acho que isso vai funcionar .. Eu sei que remover e em branco não funciona.

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.