Как удалить заголовки eTag из IIS7? - PullRequest
82 голосов
/ 25 января 2009

За Лучшие практики Yahoo для высокопроизводительных веб-сайтов , я хотел бы удалить Etags из моих заголовков (я вручную управляю всем своим кэшированием и мне не нужны Etags ... и когда / если мне нужно масштабировать до фермы, я бы очень хотел, чтобы они ушли). Я использую IIS7 на Windows Server 2008. Кто-нибудь знает, как я могу это сделать?

Ответы [ 12 ]

39 голосов
/ 25 января 2009

В IIS7 номер изменения Etag (часть Etag, следующая:) всегда устанавливается на 0.

Следовательно, Etag от сервера больше не меняется от сервера к серверу для одного и того же файла, и, следовательно, лучшие практики Yahoo больше не применяются.

Поскольку вы не можете на самом деле подавить заголовок ETag в IIS7, вероятно, лучше всего не заниматься им вообще. Я обнаружил, что наиболее полезным правилом конфигурации является «Если значение по умолчанию не нарушает что-либо, оставьте его в покое».

32 голосов
/ 09 августа 2009

Можно подумать, что выполнение этого в web.config будет работать для отключения ETag в IIS7. Но трассировка перехватчика в любом случае подтверждает, что ETag отправляется вниз.

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

Использование пробела тоже не работает. В любом случае ETag отправляется вниз.

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

Установка ETag для пустых кавычек, как предлагали другие сайты, не работает.

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

Вызывает еще больше ETag для отправки:

ETag: "8ee1ce1acf18ca1:0",""

В заключение, я ничего не могу попробовать или придумать, чтобы убить ETag на IIS7, по крайней мере без написания пользовательских модулей и т. Д.

23 голосов
/ 15 ноября 2011

Я написал специальный модуль http для этого. Это действительно не так плохо, как кажется. Вот код:

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");
        }
    }
}

Вот изменения 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>
13 голосов
/ 11 ноября 2011

Я понимаю, что это старый вопрос, но я столкнулся с ним во время поиска решения. Я думаю, что нашел разумный ответ, который я отправил для на этот вопрос .

7 голосов
/ 05 февраля 2009

У нас была эта проблема, и даже установка пустого настраиваемого заголовка ETag в IIS 7 не работала для всех файлов (например, файлов изображений). В итоге мы создали модуль HttpModule, который явно удаляет заголовок ETag.

6 голосов
/ 03 августа 2013

ОБНОВЛЕНИЕ: добавлено требование модуля перезаписи URL благодаря пользователю @ ChrisBarr

В iis 6 это просто, вы можете добавить собственный заголовок для 'ETag' = ""

В IIS 7, прочитав эту ветку и выяснив, что это невозможно без использования настраиваемого модуля http, я обнаружил, что вы можете просто установить модуль перезаписи URL-адресов Microsoft и добавить правило перезаписи исходящих сообщений следующим образом:

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

Это на самом деле работает, и вам не нужен пользовательский модуль http (dll). Разблокировка раздела конфигурации system.webServer и настройка customHeaders и т. Д. Не работает - по крайней мере, во всех случаях, которые я пытался. Это делает простое правило перезаписи исходящих сообщений.

4 голосов
/ 11 августа 2013

Кстати, когда вы используете iis8 это просто

<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: использовать или не использовать ETag

2 голосов
/ 07 ноября 2012

Я использовал removeetag.dll, найденный на http://www.caspianit.co.uk/iis7-etag-problem/, и он работал отлично.

надеюсь, это будет хорошо работать и для вас

2 голосов
/ 22 мая 2010

Ознакомьтесь с этим сообщением в блоге о том, как полностью удалить заголовок Etag http в iis6, iis7 и 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 голосов
/ 25 января 2009

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ имеет красивое руководство.

По сути, вы создаете настраиваемый заголовок ответа с именем ETag и делаете его значение пустым.

...