Zgodnie z najlepszymi praktykami Yahoo dla wysokowydajnych witryn internetowych , chciałbym usunąć Etags z moich nagłówków (ręcznie zarządzam całym moim buforowaniem i nie potrzebuję Etags ... i kiedy / jeśli muszę skalować do farmy, Naprawdę chciałbym, żeby odeszli). Używam usług IIS7 w systemie Windows Server 2008. Czy ktoś wie, jak mogę to zrobić?
83
Odpowiedzi:
W IIS7 numer zmiany Etag (część następującego Etag:) jest zawsze ustawiony na 0.
W związku z tym Etag z serwera nie różni się już od serwera do serwera dla tego samego pliku, a zatem najlepsza praktyka Yahoo nie ma już zastosowania.
Ponieważ w rzeczywistości nie można zablokować nagłówka ETag w IIS7, prawdopodobnie najlepiej byłoby nie majstrować przy nim w ogóle. Odkryłem, że najbardziej użyteczną regułą konfiguracji jest „Jeśli domyślna reguła czegoś nie psuje, zostaw ją w spokoju”.
źródło
Można by pomyśleć, że zrobienie tego w pliku web.config działałoby w celu wyłączenia ETagów w IIS7. Ale ślad sniffera potwierdza, że ETag i tak został wysłany.
<httpProtocol> <customHeaders> <remove name="ETag" /> </customHeaders> </httpProtocol>
Używanie pustego miejsca też nie działa. ETag i tak jest wysyłany.
<httpProtocol> <customHeaders> <add name="ETag" value="" /> </customHeaders> </httpProtocol>
Ustawienie ETag na puste cudzysłowy, jak sugerowały inne witryny, nie działa.
<httpProtocol> <customHeaders> <add name="ETag" value="""" /> </customHeaders> </httpProtocol>
Powoduje wysłanie jeszcze większej liczby ETagów:
Podsumowując, nic nie mogę wypróbować ani wymyślić, aby zabić ETag w IIS7, przynajmniej bez pisania niestandardowych modułów itp.
źródło
Napisałem niestandardowy moduł http do obsługi tego. Naprawdę nie jest tak źle, jak się wydaje. Oto kod:
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"); } } }
Oto zmiany w pliku web.config, które chcesz:
<configuration> <system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By"/> </customHeaders> </httpProtocol> <modules> <add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule"/> </modules> </system.webServer> </configuration>
źródło
Zdaję sobie sprawę, że to stare pytanie, ale natknąłem się na nie, szukając rozwiązania. Myślę, że znalazłem rozsądną odpowiedź, którą zamieściłem na to pytanie .
źródło
Mieliśmy ten problem i nawet ustawienie pustego niestandardowego nagłówka ETag w IIS 7 nie działało dla wszystkich plików (na przykład plików obrazów). Skończyło się na utworzeniu HttpModule, który jawnie usuwa nagłówek ETag.
źródło
AKTUALIZACJA: dodano wymagania dotyczące modułu przepisywania adresów URL dzięki użytkownikowi @ChrisBarr
W iis 6 jest to łatwe, możesz dodać niestandardowy nagłówek dla 'ETag' = ""
W IIS 7, po przeczytaniu tego wątku i stwierdzeniu, że jest to niemożliwe bez użycia niestandardowego modułu http, stwierdziłem, że można po prostu zainstalować moduł ponownego zapisywania adresów URL firmy Microsoft i dodać następującą regułę przepisywania ruchu wychodzącego:
<outboundRules> <rule name="Remove ETag"> <match serverVariable="RESPONSE_ETag" pattern=".+" /> <action type="Rewrite" value="" /> </rule> </outboundRules>
To faktycznie działa i nie potrzebujesz niestandardowego modułu http (dll). Odblokowanie sekcji konfiguracyjnej system.webServer i ustawienie customHeaders itp. Nie działa - przynajmniej we wszystkich przypadkach, które próbowałem. Robi to prosta reguła przepisywania ruchu wychodzącego.
źródło
Nawiasem mówiąc, kiedy używasz iis8, jest to proste
<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: Aby używać lub nie używać ETag
źródło
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ ma ładny przewodnik obrazkowy.
Zasadniczo tworzysz niestandardowy nagłówek odpowiedzi o nazwie ETag i ustawiasz jego wartość jako pustą.
źródło
Sprawdź ten wpis na blogu, jak całkowicie usunąć nagłówek HTTP Etag w iis6, iis7 i iis7.5
http://lightspeednow.com/blog/2010/05/21/iis-tutorial-how-to-completely-remove-etags-entity-tags-from-iis6-iis7-and-iis7-5/
źródło
Skorzystałem ze
removeetag.dll
znalezionego na http://www.caspianit.co.uk/iis7-etag-problem/ i działało idealnie.mam nadzieję, że u Ciebie też będzie dobrze działać
źródło
W IIS 7 nie powinieneś już martwić się o etags, ponieważ numer konfiguracji IIS jest zawsze ustawiony na 0.
Nadal występuje problem, jeśli masz serwery sieciowe IIS6 i IIS7 w tej samej farmie. W takim przypadku należałoby ręcznie ustawić numer konfiguracji usług IIS6 na 0, zgodnie z opisem w tym artykule .
Etykiety są w rzeczywistości bardzo przydatne, ponieważ nie musisz zmieniać nazwy pliku, tak jak robi to przepełnienie stosu (tj. Default.css? 1234). Jeśli zmienisz plik default.css, zmieni to etag i dlatego kolejne żądania będą pobierać plik z serwera, a nie z pamięci podręcznej.
źródło
Myślę, że to zadziała ... Wiem, że usuwanie i puste nie działa.
<configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="ETag" value=" " /> </customHeaders> </httpProtocol> </configuration> </system.webServer>
źródło