Согласно рекомендациям Yahoo для высокопроизводительных веб-сайтов , я бы хотел удалить Etags из своих заголовков (я вручную управляю всем своим кешированием, и мне не нужны Etags ... и когда / если мне нужно масштабировать до фермы, Я бы очень хотел, чтобы они ушли). Я использую IIS7 на Windows Server 2008. Кто-нибудь знает, как я могу это сделать?
83
Ответы:
В IIS7 номер изменения Etag (часть Etag, следующая за:) всегда имеет значение 0.
Следовательно, Etag с сервера больше не меняется от сервера к серверу для одного и того же файла, и поэтому рекомендации Yahoo больше не применяются.
Поскольку на самом деле вы не можете подавить заголовок ETag в IIS7, вероятно, лучше вообще не возиться с ним. Я обнаружил, что наиболее полезным правилом конфигурации является «Если по умолчанию что-то не ломается, оставьте это в покое».
источник
Вы могли подумать, что если сделать это в файле 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 на IIS7, по крайней мере, без написания пользовательских модулей и т. Д.
источник
Я написал специальный модуль 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>
источник
Я понимаю, что это старый вопрос, но я столкнулся с ним, когда искал решение. Я думаю, что нашел разумный ответ на этот вопрос .
источник
У нас была эта проблема, и даже установка пустого пользовательского заголовка ETag в IIS 7 не работала для всех файлов (например, файлов изображений). В итоге мы создали HttpModule, который явно удаляет заголовок ETag.
источник
ОБНОВЛЕНИЕ: добавлено требование к модулю перезаписи URL благодаря пользователю @ChrisBarr
В iis 6 это просто, вы можете добавить собственный заголовок для 'ETag' = ""
В IIS 7, прочитав эту ветку и поняв, что это невозможно без использования настраиваемого модуля http, я обнаружил, что вы можете просто установить модуль Microsoft URL Rewrite и добавить правило перезаписи исходящего трафика следующим образом:
<outboundRules> <rule name="Remove ETag"> <match serverVariable="RESPONSE_ETag" pattern=".+" /> <action type="Rewrite" value="" /> </rule> </outboundRules>
Это действительно работает, и вам не нужен специальный модуль http (dll). Разблокировка раздела конфигурации system.webServer и установка customHeaders и т. Д. Не работает - по крайней мере, во всех случаях, которые я пробовал. Простое исходящее правило перезаписи делает.
источник
Кстати при использовании 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
источник
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ имеет хорошее иллюстрированное руководство.
По сути, вы создаете настраиваемый заголовок ответа с именем ETag и делаете его значение пустым.
источник
Ознакомьтесь с этим сообщением в блоге о том, как полностью удалить http-заголовок Etag в 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/
источник
Я использовал
removeetag.dll
найденный на http://www.caspianit.co.uk/iis7-etag-problem/, и он отлично работал.надеюсь, это сработает и для вас
источник
В IIS 7 вам больше не нужно беспокоиться об etags, поскольку номер конфигурации IIS всегда равен 0.
Проблема все еще существует, если у вас есть веб-серверы IIS6 и IIS7 в одной ферме. В этом случае вам придется вручную установить номер конфигурации IIS6 на 0, как описано в этой статье .
Etags на самом деле очень полезны, поскольку вам не нужно менять имя файла, как это делает переполнение стека (например, default.css? 1234). Если вы измените файл default.css, он изменит etag, и поэтому последующие запросы будут получать файл с сервера, а не из кеша.
источник
Я думаю, это сработает .. Я знаю, что удалить и пустить не получится.
<configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="ETag" value=" " /> </customHeaders> </httpProtocol> </configuration> </system.webServer>
источник