IIS7에서 eTag 헤더를 제거하려면 어떻게합니까?


83

고성능의 웹 사이트에 대한 야후의 우수 사례 , 내가 직접 내 모든 캐싱을 관리하고 ETag를위한 필요가 없습니다 ... 그리고있어 (내 헤더에서 ETag를 제거하고자 할 때 / 나는 농장으로 확장해야하는 경우, 나는 그들이 사라지기를 정말로 바란다). Windows Server 2008에서 IIS7을 실행하고 있습니다.이 작업을 수행 할 수있는 방법을 아는 사람이 있습니까?


이 게시물의 두 번째 답변에 표시된 것처럼 IIS 8.0 이상에서 작동합니다. stackoverflow.com/questions/7947420/…
RBT

답변:


39

IIS7에서 Etag 변경 번호 (Etag 다음 부분)는 항상 0으로 설정됩니다.

따라서 서버의 Etag가 더 이상 동일한 파일에 대해 서버마다 다르지 않으므로 Yahoo 모범 사례가 더 이상 실제로 적용되지 않습니다.

IIS7에서 실제로 ETag 헤더를 억제 할 수 없기 때문에 전혀 조작하지 않는 것이 가장 좋습니다. 지금까지 가장 유용한 구성 규칙은 "기본값으로 인해 문제가 발생하지 않으면 그대로 두십시오"라는 것을 알았습니다.


2
다른 이유로 etags를 죽이고 싶은 유혹이 있습니다. 제가 잘못 인식하지 않는 한, 단일 서버 에서 IIS 가 etag 의 첫 번째 구성 요소 (즉, "Filetimestamp"라고 함)를 무상으로 변경 하는 것을보고 있습니다. 수정되었습니다. 예를 들어 최신 버전의 파일이 브라우저에 있고 브라우저는 'If-None-Match : "01cc3a8acccc1 : 0"'/ 'If-Modified-Since : Fri, 06 Jan 2012 00:32 : 24 GMT ', IIS는'ETag : "b6baeea8acccc1 : 0" '/'Last-Modified : Fri, 06 Jan 2012 00:32:24 GMT '로 응답합니다. 이들은 foo.js? rev = xxx와 같은 URL이있는 js 파일이며 매번 동일한 xxx를 전달합니다.
크리스

@Chris : 저도 거의 똑같은 일을합니다. js 파일이 캐시되도록 허용하고 파일이 변경 될 때만 xxx를 변경합니다. 나는 당신이 어떤 버전의 IIS에서 보시는 행동을 경험했다고 말할 수 없습니다. 내가 의심하는 IIS 구성에 약간 이상한 것이 있습니다.
AnthonyWJones

감사. 아시다시피, etags의 "Filetimestamp"부분은 요청중인 파일의 타임 스탬프만을 기반으로하며 머신 / 프로세스 / 애플리케이션의 상태에 대한 것이 아닌가?
Chris

@Chris : 내가 아는 한 E-Tag는 파일 시간만을 기준으로합니다. 나는 내 서버를 만지작 거리려고했지만 당신이보고있는 문제를 재현 할 수 없다.
AnthonyWJones

서버를 수정할 수 없도록 만드는 것이 현명한 정책인지 모르겠습니다. 게다가. 나는 먼 미래의 Expires를 테스트하고 있으며 단순히 HTTP 304 응답을 원하지 않습니다. 나는 자산이 거의 변하지 않는다는 것을 알기 때문에 사물이 캐시에 오래 머물기를 원합니다. HTTP 사양 RFC 2616을 포함하여 많은 IETF 문서가 있습니다. 사이트 관리자는 자신의 상황을 훨씬 더 잘 알 수 있으므로이를 설명 할 수 있고 수행해야합니다. 구현자는 항상 "야생"에서 일어나는 일을 찾고 있습니다.
Josh Robinson

33

web.config에서이 작업을 수행하면 IIS7에서 ETag를 비활성화 할 수 있다고 생각할 것입니다. 그러나 스니퍼 추적은 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", ""

결론적으로, 적어도 사용자 정의 모듈을 작성하지 않고서는 IIS7에서 ETag를 죽이는 작업을 시도하거나 생각할 수 없습니다.


2
이 Jeff를 확인하지는 않았지만 httpProtocol 섹션이 웹 사이트 수준에서 잠겨 있기 때문일 수 있습니다. web.config 파일을 통해 iis7 압축 수준 을 프로그래밍 방식으로 설정하려고 할 때이 경우를 발견했습니다 . 마침내 루트 서버 수준에서 해당 섹션을 잠금 해제 해야했습니다. 이 섹션에 동일한 문제가있을 수 있습니까? (모든 IIS 설정이 GUI를 통해 제공
되었으면

1
@ Pure.Krome : 위의 Jeff의 두 번째 시도와 결합 된 잠금 해제는 대부분의 경우 저에게 효과가있는 것 같습니다 ... (물론!) 이미지 콘텐츠를 제외 하고요. :-\ <sectionGroup name = "system.webServer"> <section name = "httpProtocol"overrideModeDefault = "Allow"/> </ sectionGroup> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag"value = ""/> </ customHeaders> </ httpProtocol> 최소한 여기에 부분적인 해결책이있는 것 같습니다.
jerhewet 2011 년

@jer 당신은 적절한 대답으로 그를 추가해야합니다
제프 앳 우드

1
@jerhewet가 (윈도우 서버 2008 R2 7.5 IIS) 나를 위해 작동하지 않습니다
sinelaw

1
다른 모든 솔루션이 실패했거나 구현할 수없는 경우 간단한 재 작성 규칙이 작동했습니다. 내 대답보기 : stackoverflow.com/a/18025228/705198
AndrewPK 2013-08-02

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, 그러나 이것은 파비콘과 같은 것이 아니라 웹 사이트에서 요청한 리소스만을 다루는 것으로 보입니다
Brad

13

나는 이것이 오래된 질문이라는 것을 알고 있지만 해결책을 찾는 동안 발견했습니다. 이 질문 에 대해 게시 한 합리적인 답변을 찾은 것 같습니다 .


캐시를 변경 한 후 삭제하는 한 작동이 확인되었습니다.;)
peter3

7

이 문제가 있었고 IIS 7에서 빈 사용자 지정 ETag 헤더를 설정하는 것조차 모든 파일 (예 : 이미지 파일)에 대해 작동하지 않았습니다. 우리는 ETag 헤더를 명시 적으로 제거하는 HttpModule을 생성했습니다.


6

업데이트 : @ChrisBarr 사용자 덕분에 URL 재 작성 모듈 요구 사항 추가

iis 6에서는 'ETag'= ""에 대한 사용자 지정 헤더를 추가 할 수 있습니다.

IIS 7에서이 스레드를 읽고 사용자 지정 http 모듈을 사용하지 않고는 불가능하다는 것을 확인한 후 Microsoft의 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>
Duncan

2

iis6, iis7 및 iis7.5에서 Etag http 헤더를 완전히 제거하는 방법에 대한이 블로그 게시물을 확인하십시오.

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가 가장 큰 문제인 대규모 웹 팜의 경우 특히 그렇습니다.
Keith


1

IIS 7에서는 IIS 구성 번호가 항상 0으로 설정되므로 더 이상 etag에 대해 걱정할 필요가 없습니다.

동일한 팜에 IIS6 및 IIS7 웹 서버가있는 경우 여전히 문제가 있습니다. 이 경우이 문서에 설명 된대로 IIS6 구성 번호를 0으로 수동으로 설정해야합니다 .

Etag는 스택 오버플로처럼 파일 이름을 변경할 필요가 없기 때문에 실제로 매우 유용합니다 (예 : default.css? 1234). default.css 파일을 변경하면 etag가 변경되므로 후속 요청은 캐시가 아닌 서버에서 파일을 가져옵니다.


7
만료 날짜가 먼 경우 브라우저가 지정된 날짜까지 (또는 파일 이름이 변경 될 때까지) 문자 그대로 다시 파일을 요청하지 않기 때문에 ETag는 관련이 없습니다. 따라서 파일을 제거 할 필요가 있습니다.이 시나리오에서는 쓸모가 없습니다.
Jeff Atwood

3
@JeffAtwood가 엄격하게 사실이 아닙니다. 사용자가 새로 고침 버튼을 누르면 브라우저가 파일을 요청합니다. etag가 동일하면 200을 받으면 304를 얻습니다. 여기서 문제는 1이 될 때 2 헤더를 보내는 것입니다. 된만큼이
샘 사프란

1

나는 이것이 작동 할 것이라고 생각한다 .. 나는 제거하고 공백이 작동하지 않는다는 것을 안다.

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.