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?
83
Respostas:
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á".
fonte
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="""" /> </customHeaders> </httpProtocol>
Faz com que ainda mais ETag seja enviada:
Concluindo, nada que eu possa tentar ou pensar funciona para matar ETag no IIS7, pelo menos sem escrever módulos personalizados, etc.
fonte
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>
fonte
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 .
fonte
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.
fonte
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.
fonte
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
fonte
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ tem um bom guia pictórico.
Essencialmente, você cria um cabeçalho de resposta personalizado denominado ETag e torna seu valor vazio.
fonte
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/
fonte
Usei o
removeetag.dll
encontrado em http://www.caspianit.co.uk/iis7-etag-problem/ e funcionou perfeitamente.espero que funcione bem para você também
fonte
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.
fonte
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>
fonte