Par les meilleures pratiques de Yahoo pour les sites Web haute performance , je voudrais supprimer Etags de mes en-têtes (je gère manuellement toute ma mise en cache et je n'ai pas besoin d'Etags ... et quand/si je besoin d'évoluer vers une ferme, je voudrais vraiment qu'ils disparaissent). J'exécute IIS7 sur Windows Server 2008. Quelqu'un sait-il comment faire cela?
Sous IIS7, le numéro de modification Etag (la partie de Etag suivante:) est toujours défini sur 0.
Par conséquent, l'Etag du serveur ne varie plus d'un serveur à l'autre pour le même fichier et donc la meilleure pratique de Yahoo ne s'applique plus vraiment.
Comme vous ne pouvez pas réellement supprimer l'en-tête ETag sur IIS7, il serait probablement préférable de ne pas le manipuler du tout. J'ai trouvé de loin que la règle de configuration la plus utile est "Si la valeur par défaut ne casse pas quelque chose, laissez-la tranquille".
Vous penseriez que cela dans le web.config fonctionnerait pour désactiver les ETags dans IIS7. Mais la trace du renifleur confirme que ETag est envoyé de toute façon.
<httpProtocol>
<customHeaders>
<remove name="ETag" />
</customHeaders>
</httpProtocol>
L'utilisation de blanc ne fonctionne pas non plus. ETag est envoyé de toute façon.
<httpProtocol>
<customHeaders>
<add name="ETag" value="" />
</customHeaders>
</httpProtocol>
La définition de l'ETag sur des guillemets vides comme d'autres sites l'ont suggéré ne fonctionne pas.
<httpProtocol>
<customHeaders>
<add name="ETag" value="""" />
</customHeaders>
</httpProtocol>
encore plus ETag à envoyer:
ETag: "8ee1ce1acf18ca1: 0", ""
En conclusion, rien que je puisse essayer ou penser à des travaux pour tuer ETag sur IIS7, au moins sans écrire de modules personnalisés, etc.
J'ai écrit un module http personnalisé pour gérer cela. Ce n'est vraiment pas aussi mauvais qu'il y paraît. Voici le code:
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");
}
}
}
Voici les modifications que vous souhaitez apporter à web.config:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By"/>
</customHeaders>
</httpProtocol>
<modules>
<add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule"/>
</modules>
</system.webServer>
</configuration>
Je me rends compte que c'est une vieille question, mais je l'ai rencontrée en cherchant une solution. Je pense avoir trouvé une réponse raisonnable que j'ai publiée pour cette question .
Nous avons eu ce problème et même en définissant un en-tête ETag personnalisé vierge dans IIS 7 ne fonctionnait pas pour tous les fichiers (par exemple, les fichiers image). Nous avons fini par créer un HttpModule qui supprime explicitement l'en-tête ETag .
MISE À JOUR: ajout d'une exigence de module de réécriture d'URL grâce à l'utilisateur @ChrisBarr
Dans iis 6, c'est facile, vous pouvez ajouter un en-tête personnalisé pour 'ETag' = ""
Dans IIS 7, après avoir lu ce fil et compris qu'il était impossible sans utiliser un module http personnalisé, j'ai constaté que vous pouvez simplement installer module de réécriture d'URL de Microsoft et ajouter une règle de réécriture sortante comme suit:
<outboundRules>
<rule name="Remove ETag">
<match serverVariable="RESPONSE_ETag" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
Cela fonctionne réellement et vous n'avez pas besoin d'un module http personnalisé (dll). Déverrouiller la section de configuration system.webServer et définir customHeaders, etc., ne fonctionne pas - du moins dans tous les cas que j'ai essayés. Une règle de réécriture sortante simple le fait.
Au fait, quand vous utilisez iis8 c'est 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>
Consultez cet article de blog sur la façon de supprimer complètement l'en-tête http Etag dans iis6, iis7 et iis7.5
J'ai utilisé le removeetag.dll
trouvé sur http://www.caspianit.co.uk/iis7-etag-problem/ et cela a parfaitement fonctionné.
j'espère que cela fonctionnera bien pour vous aussi
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ a un guide illustré de Nice.
Essentiellement, vous créez un en-tête de réponse personnalisé nommé ETag et rendez sa valeur vide.
Dans IIS 7, vous ne devriez plus avoir à vous soucier des etags car le numéro de configuration IIS est toujours défini sur 0.
Le problème persiste si vous disposez de serveurs Web IIS6 et IIS7 dans la même batterie. Dans ce cas, vous devez définir manuellement le numéro de configuration IIS6 sur 0 comme décrit dans cet article .
Les Etags sont en fait très utiles car vous n'avez pas besoin de changer le nom de fichier comme le fait le débordement de pile (par exemple default.css? 1234). Si vous modifiez le fichier default.css, il modifiera l'etag et par conséquent les requêtes suivantes obtiendront le fichier du serveur et non du cache.
Je pense que cela fonctionnera .. Je sais que supprimer et vide ne fonctionne pas.
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="ETag" value=" " />
</customHeaders>
</httpProtocol>
</configuration>
</system.webServer>