Per Лучшие практики Yahoo для высокопроизводительных веб-сайтов, я бы хотел удалить Etags из своих заголовков (я вручную управляю всеми моими кеширования и не нуждаются в Etags... и когда/если мне нужно масштабировать до фермы, мне бы очень хотелось, чтобы они ушли). Я запускаю IIS7 на Windows Server 2008. Кто-нибудь знает, как я могу это сделать?
Как удалить заголовки eTag из IIS7?
Ответ 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="""" />
</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
Ответ 8
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ имеет красивое иллюстрированное руководство.
По существу, вы создаете пользовательский заголовок ответа с именем ETag и делаете его значение пустым.
Ответ 9
Отметьте это сообщение в блоге о том, как полностью удалить HTTP-заголовок Etag в iis6, iis7 и iis7.5
Ответ 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>