Як видалити заголовки eTag із IIS7?


83

Відповідно до найкращих практик Yahoo щодо високопродуктивних веб-сайтів , я хотів би видалити теги зі своїх заголовків (я вручну керую всім своїм кешуванням і не потребую Etags ... і коли / якщо мені потрібно масштабуватися до ферми, Я б дуже хотів, щоб вони зникли). Я використовую IIS7 на Windows Server 2008. Хтось знає, як я можу це зробити?


Це працює для IIS 8.0 і далі, принаймні, як показано у другій відповіді цього допису: stackoverflow.com/questions/7947420/…
RBT

Відповіді:


39

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

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

Оскільки насправді ви не можете придушити заголовок ETag на IIS7, мабуть, найкраще, щоб ви не возились з ним взагалі. Я знайшов найкорисніше правило конфігурації: "Якщо за замовчуванням щось не порушує, залиште це в спокої".


2
У мене є спокуса вбити етаги з іншої причини: якщо я не сприймаю речі, я бачу, як IIS на одному сервері безоплатно змінює перший компонент етагів (тобто так звану "Filetimestamp"), незважаючи на те, що мій файл не модифікований. Наприклад, остання версія файлу буде в браузері, браузер надішле повідомлення 'If-None-Match: "01cc3a8acccc1: 0"' / 'If-Modified-Since: Fri, 06 Jan 2012 00:32: 24 GMT ', а IIS відповість "ETag:" b6baeea8acccc1: 0 "' /" Остання зміна: п'ятниця, 06 січня 2012 00:32:24 GMT ". Це файли js з URL-адресами, такі як foo.js? Rev = xxx, щоразу передаючи однакові xxx.
Кріс

@Chris: Я роблю майже те саме, дозволяю кешувати файли js і змінюю xxx лише при зміні файлу. Не можу сказати, що я коли-небудь стикався з поведінкою, яку ви спостерігаєте в будь-якій версії IIS. Щось трохи дивне у вашій конфігурації IIS, я підозрюю.
AnthonyWJones

Дякую. Наскільки вам відомо, чи частина етапів "Filetimestamp" базується ТІЛЬКИ на позначці часу запитуваного файлу, а не на чомусь про стан машини / процесу / програми?
Кріс

@Chris: Наскільки я знаю, так, E-Tag базується лише на часу файлу. Я спробував возитися з моїм сервером, і не можу відтворити проблему, яку ви бачите.
AnthonyWJones

Я не знаю, що робити сервер не модифікованим є розумною політикою. До того ж. Я тестую термін дії Expires на майбутнє, і я просто не хочу відповіді HTTP 304 - ніколи. Я хочу, щоб речі тривалий час залишалися в кеші, оскільки я знаю, що ці активи рідко змінюються. Існує безліч документації IETF, включаючи специфікацію HTTP RFC 2616, яка пояснює, що це можна і потрібно робити як адміністратор сайту, оскільки ця людина буде набагато краще знати свою ситуацію. Реалізатори завжди шукають, що відбувається в «дикій природі».
Джош Робінсон,

33

Можна подумати, що це зробити в 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, принаймні без написання спеціальних модулів тощо.


2
Я не підтвердив цього Джеффа, але це могло бути тому, що розділ httpProtocol заблокований на рівні веб-сайту. Я виявив це у випадку, коли я намагався програмно встановити рівень стиснення iis7 через файл web.config. Мені довелося остаточно розблокувати цей розділ на рівні кореневого сервера. Можливо, у цьому розділі така сама проблема? (Я б дуже хотів, щоб ВСІ налаштування IIS були доступні через графічний інтерфейс)
Pure.Krome

1
@ Pure.Krome: Розблокування в поєднанні з другою спробою Джеффа вище, здається, працює в мене в більшості випадків ... за винятком (звичайно!) Для вмісту зображення. : - \ <sectionGroup name = "system.webServer"> <section name = "httpProtocol" overrideModeDefault = "Allow" /> </sectionGroup> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag" value = "" /> </customHeaders> </httpProtocol> Отже, принаймні тут, здається, є часткове рішення.
jerhewet

@jer ви повинні додати це як правильну відповідь
Джефф Етвуд,

1
@jerhewet у мене не працює (Windows Server 2008 R2, IIS 7.5)
sinelaw

1
Там, де всі інші рішення були невдалими або їх було неможливо здійснити для мене, працювало просте правило перезапису. Дивіться моя відповідь: stackoverflow.com/a/18025228/705198
AndrewPK

22

Я написав власний модуль 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>

1
+1, однак, схоже, це стосується лише ресурсів, що запитуються на веб-сайті, а не таких речей, як значки
Бред

13

Я усвідомлюю, що це давнє запитання, але я зіткнувся з ним під час пошуку рішення. Думаю, я знайшов розумну відповідь, яку розмістив на це запитання .


підтверджено, що він працює, доки ви очистите кеш після його зміни;)
peter3

7

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


6

ОНОВЛЕННЯ: додано вимогу до модуля перезапису URL-адреси завдяки користувачеві @ChrisBarr

У iis 6 це легко, ви можете додати власний заголовок для 'ETag' = ""

У IIS 7, прочитавши цей потік і зрозумівши, що це неможливо без використання користувацького модуля http, я виявив, що ви можете просто встановити модуль перезапису URL-адрес корпорації Майкрософт і додати правило перезапису вихідних повідомлень таким чином:

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

Це насправді працює, і вам не потрібен власний модуль http (dll). Розблокування розділу конфігурації system.webServer та встановлення customHeaders тощо не працює - принаймні у всіх випадках, які я намагався. Це робить просте правило перезапису вихідних даних.


1
Це рішення вимагає встановлення цього спеціального модуля у IIS, правда?
CBarr

@ChrisBarr так, це так - вибачте, я не зміг це згадати. Відповідь оновлено.
AndrewPK

4

До речі, коли ви використовуєте 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

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ має приємний графічний путівник.

По суті, ви створюєте власний заголовок відповіді з назвою ETag і робите його значення порожнім.


У IIS6 це працювало для мене лише тоді, коли я не встановлював значення, а не лише дві подвійні лапки. тобто <httpProtocol> <customHeaders> <add name = "ETag" value = "" /> </customHeaders> </httpProtocol>
Дункан

2

Перегляньте цю публікацію в блозі про те, як повністю видалити заголовок 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
Для цього потрібен сторонній штекер, який називається Helicon Ape. Насправді нам потрібне рішення, яке використовує власну конфігурацію IIS, а не додатковий штекер. Це особливо актуально для будь-якої великої веб-ферми, де саме ETag є найбільшою проблемою.
Кіт


1

У IIS 7 вам більше не доведеться турбуватися про етаги, оскільки номер конфігурації IIS завжди встановлений на 0.

Проблема все ще є, якщо у вас є веб-сервери IIS6 і IIS7 в одній фермі. У цьому випадку вам доведеться вручну встановити номер конфігурації IIS6 на 0, як описано в цій статті .

Етаги насправді дуже корисні, оскільки вам не потрібно змінювати ім'я файлу, як це робить переповнення стека (тобто default.css? 1234). Якщо ви зміните файл default.css, він змінить етап, а отже, наступні запити отримають файл із сервера, а не з кешу.


7
Далі закінчені терміни дії роблять ETags неактуальними, оскільки браузер буквально ніколи більше не вимагатиме файл до вказаної дати (або, звичайно, до зміни імені файлу.) Таким чином, необхідність його видалення - вона застаріла в цьому випадку.
Джефф Етвуд,

3
@JeffAtwood не є суто істинним, браузер запитує файл, якщо користувач натисне кнопку оновлення; якщо етап однаковий, ви отримаєте 304, якщо різниця отримає 200, проблема тут полягає в тому, що ви відправляєте 2 заголовки, де 1 вистачило
Сем Сафрон

1

Я думаю, це спрацює .. Я знаю, що видалення та порожнє не працює.

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.