Как удалить заголовки eTag из IIS7?

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

Ответ 1

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

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

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

Ответ 2

Вы бы подумали, что это сделать в web.config будет работать, чтобы отключить ETags в 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, по крайней мере, без написания пользовательских модулей и т.д.

Ответ 3

Я написал специальный 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>

Ответ 4

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

Ответ 5

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

Ответ 6

UPDATE: добавлен запрос на повторный ввод URL-адреса благодаря пользователю @ChrisBarr

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

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

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

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

Ответ 7

Кстати, когда вы используете 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

Ответ 10

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

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

Ответ 11

В IIS 7 вам больше не придется беспокоиться о etags, так как номер конфигурации IIS всегда равен 0.

По-прежнему существует проблема, если у вас есть веб-серверы IIS6 и IIS7 в одной ферме. В этом случае вам придется вручную установить номер конфигурации IIS6 в 0, как описано в этой статье .

Etags на самом деле очень полезны, так как вам не нужно менять имя файла, например, переполнение стека (например, default.css? 1234). Если вы измените файл default.css, он изменит etag, и поэтому последующие запросы получат файл с сервера, а не с кешем.

Ответ 12

Я думаю, что это сработает. Я знаю, что remove и blank не работают.

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>