Làm cách nào để xóa tiêu đề eTag khỏi IIS7?


83

Theo các phương pháp hay nhất của Yahoo cho các trang web hiệu suất cao , tôi muốn xóa Etags khỏi tiêu đề của mình (Tôi đang quản lý thủ công tất cả bộ nhớ đệm của mình và không cần Etags ... và khi nào / nếu tôi cần mở rộng quy mô trang trại, Tôi thực sự muốn họ biến mất). Tôi đang chạy IIS7 trên Windows Server 2008. Có ai biết cách tôi có thể thực hiện việc này không?


Nó hoạt động cho IIS 8.0 trở đi ít nhất như thể hiện trong các câu trả lời thứ hai của bài viết này: stackoverflow.com/questions/7947420/...
RBT

Câu trả lời:


39

Trong IIS7, số thay đổi Etag (một phần của Etag sau:) luôn được đặt thành 0.

Do đó Etag từ máy chủ không còn khác nhau giữa các máy chủ cho cùng một tệp và do đó phương pháp hay nhất của Yahoo không còn thực sự được áp dụng nữa.

Vì bạn thực sự không thể ngăn chặn tiêu đề ETag trên IIS7, nên tốt nhất là bạn không nên loay hoay với nó. Tôi đã tìm thấy quy tắc cấu hình hữu ích nhất cho đến nay là "Nếu mặc định không phá vỡ điều gì đó, hãy để nó yên".


2
Tôi muốn giết etags vì một lý do khác: Trừ khi tôi nhận thức sai mọi thứ, tôi thấy IIS trên một máy chủ duy nhất thay đổi vô cớ thành phần đầu tiên của etags (tức là cái gọi là "Filetimestamp") mặc dù tệp của tôi không đã sửa đổi. Ví dụ: phiên bản mới nhất của tệp sẽ có trong trình duyệt, trình duyệt sẽ gửi 'If-None-Match: "01cc3a8acccc1: 0"' / 'If-Modified-Since: Fri, 06 Jan 2012 00:32: 24 GMT 'và IIS sẽ trả lời bằng' ETag: "b6baeea8acccc1: 0" '/' Sửa lần cuối: Thứ Sáu, ngày 06 tháng 1 năm 2012 00:32:24 GMT '. Đây là các tệp js với các URL như foo.js? Rev = xxx, truyền cùng một xxx mỗi lần.
Chris

@Chris: Tôi gần như làm điều tương tự, tôi cho phép các tệp js được lưu vào bộ nhớ cache và chỉ thay đổi xxx khi tệp được thay đổi. Tôi không thể nói rằng tôi đã từng gặp phải hành vi mà bạn đang thấy trên bất kỳ phiên bản nào của IIS. Tôi nghi ngờ có điều gì đó hơi kỳ lạ với cấu hình IIS của bạn.
AnthonyWJones

Cảm ơn. Theo như bạn biết, phần "Filetimestamp" của etags CHỈ dựa trên dấu thời gian của tệp được yêu cầu chứ không dựa trên bất kỳ điều gì về trạng thái của máy / quy trình / ứng dụng?
Chris

@Chris: Theo như tôi biết thì có E-Tag chỉ dựa trên thời gian của tệp. Tôi đã thử xoay quanh máy chủ của mình và tôi không thể tái tạo sự cố mà bạn đang gặp phải.
AnthonyWJones

Tôi không biết rằng việc đặt máy chủ không thể sửa đổi là chính sách khôn ngoan. Ngoài ra. Tôi đang thử nghiệm các Expires trong tương lai xa và tôi chỉ đơn giản là không muốn phản hồi HTTP 304 - bao giờ hết. Tôi muốn mọi thứ ở trong bộ nhớ cache trong một thời gian dài vì tôi biết những nội dung đó hiếm khi thay đổi. Có rất nhiều tài liệu IETF ngoài đó bao gồm thông số HTTP RFC 2616 giải thích điều này có thể và nên được thực hiện với tư cách là quản trị viên trang web vì người đó sẽ biết tình hình của họ tốt hơn nhiều. Những người thực hiện luôn tìm kiếm những gì đang xảy ra trong "tự nhiên".
Josh Robinson

33

Bạn sẽ nghĩ rằng làm điều này trong web.config sẽ có tác dụng vô hiệu hóa ETags trong IIS7. Nhưng dấu vết của trình đánh hơi xác nhận rằng ETag vẫn được gửi xuống.

<httpProtocol>
    <customHeaders>
        <remove name="ETag" />
    </customHeaders>
</httpProtocol>

Sử dụng trống cũng không hoạt động. ETag vẫn được gửi xuống.

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="" />
    </customHeaders>
</httpProtocol>

Đặt ETag thành dấu ngoặc kép trống như các trang web khác đã đề xuất không hoạt động.

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="&quot;&quot;" />
    </customHeaders>
</httpProtocol>

Khiến nhiều ETag được gửi xuống:

ETag: "8ee1ce1acf18ca1: 0", ""

Tóm lại, tôi không thể thử hoặc nghĩ ra cách nào để giết ETag trên IIS7, ít nhất là không cần viết các mô-đun tùy chỉnh, v.v.


2
Tôi chưa xác nhận Jeff này, nhưng điều này có thể là do phần httpProtocol bị khóa ở cấp trang web. Tôi đã tìm thấy trường hợp này khi tôi đang cố gắng đặt mức nén iis7 theo chương trình thông qua tệp web.config. Cuối cùng tôi đã phải mở khóa phần đó ở cấp máy chủ gốc. Có thể phần này có cùng một vấn đề? (Tôi thực sự ước tất cả các cài đặt IIS đều có sẵn thông qua GUI)
Pure.Krome

1
@ Pure.Krome: Việc mở khóa, kết hợp với nỗ lực thứ hai của Jeff ở trên, dường như hiệu quả với tôi trong hầu hết các trường hợp ... ngoại trừ (tất nhiên!) Cho nội dung hình ảnh. : - \ <sectionGroup name = "system.webServer"> <section name = "httpProtocol" overrideModeDefault = "Allow" /> </sectionGroup> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag" value = "" /> </customHeaders> </httpProtocol> Vì vậy, ít nhất dường như có một giải pháp phần nào ở đây.
jerhewet

@jer bạn nên thêm đó như là một câu trả lời thích hợp
Jeff Atwood

1
@jerhewet không hoạt động với tôi (Windows Server 2008 R2, IIS 7.5)
sinelaw

1
Khi tất cả các giải pháp khác không thành công hoặc không khả thi để thực hiện đối với tôi, một quy tắc viết lại đơn giản đã hoạt động. Xem câu trả lời của tôi: stackoverflow.com/a/18025228/705198
AndrewPK

22

Tôi đã viết một mô-đun http tùy chỉnh để xử lý điều này. Nó thực sự không tệ như nó âm thanh. Đây là mã:

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");
        }
    }
}

Đây là những thay đổi web.config mà bạn muốn:

<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, tuy nhiên điều này chỉ xuất hiện với các nguồn lực bìa hỏi của trang web, không những thứ như favicon
Brad

13

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi đã gặp nó trong khi tìm kiếm giải pháp. Tôi nghĩ rằng tôi đã tìm thấy một câu trả lời hợp lý mà tôi đã đăng cho câu hỏi này .


được xác nhận là hoạt động miễn là bạn xóa bộ nhớ cache của mình sau khi thay đổi nó;)
peter3

7

Chúng tôi gặp sự cố này và thậm chí việc đặt tiêu đề ETag tùy chỉnh trống trong IIS 7 không hoạt động cho tất cả các tệp (ví dụ: tệp hình ảnh). Chúng tôi đã kết thúc việc tạo HttpModule xóa tiêu đề ETag một cách rõ ràng.


6

CẬP NHẬT: thêm yêu cầu Mô-đun ghi lại URL nhờ người dùng @ChrisBarr

Trong iis 6, thật dễ dàng, bạn có thể thêm tiêu đề tùy chỉnh cho 'ETag' = ""

Trong IIS 7, sau khi đọc chuỗi này và nhận ra rằng không thể không sử dụng mô-đun http tùy chỉnh, tôi thấy rằng bạn có thể chỉ cần cài đặt mô-đun Viết lại URL của Microsoft và thêm quy tắc ghi lại gửi đi như sau:

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

Điều này thực sự hoạt động và bạn không cần mô-đun http tùy chỉnh (dll). Mở khóa phần cấu hình system.webServer và đặt customHeaders, v.v., không hoạt động - ít nhất là trong tất cả các trường hợp tôi đã thử. Một quy tắc viết lại gửi đi đơn giản thực hiện.


1
Giải pháp này yêu cầu mô-đun tùy chỉnh này phải được cài đặt trong IIS, đúng không?
CBarr

@ChrisBarr vâng, nó có - xin lỗi tôi không đề cập được. Đã cập nhật câu trả lời.
AndrewPK

4

Nhân tiện, khi bạn sử dụng iis8, nó đơn giản

<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: Sử dụng hoặc không sử dụng ETag


2

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ có một hướng dẫn bằng hình ảnh rất hay.

Về cơ bản, bạn tạo tiêu đề phản hồi tùy chỉnh có tên ETag và làm trống giá trị của nó.


Trên IIS6, điều này chỉ hoạt động với tôi khi tôi không đặt giá trị nào không chỉ hai dấu ngoặc kép. tức là <httpProtocol> <customHeaders> <add name = "ETag" value = "" /> </customHeaders> </httpProtocol>
Duncan

2

Kiểm tra bài đăng trên blog này về cách xóa hoàn toàn tiêu đề Etag http trong iis6, iis7 và iis7.5

http://lightspeednow.com/blog/2010/05/21/iis-tutorial-how-to-compleently-remove-etags-entity-tags-from-iis6-iis7-and-iis7-5/


2
Điều đó yêu cầu một trình cắm của bên thứ 3 có tên là Helicon Ape. Thực sự, chúng tôi cần một giải pháp sử dụng cấu hình IIS gốc, không phải một plug-in bổ sung. Điều này đặc biệt đúng với bất kỳ trang web quy mô lớn nào, đây chính xác là nơi mà ETag là vấn đề lớn nhất.
Keith


1

Trong IIS 7, bạn không cần phải lo lắng về các lỗi nữa vì số cấu hình IIS luôn được đặt thành 0.

Vẫn có sự cố nếu bạn có máy chủ web IIS6 & IIS7 trong cùng một trang trại. Trong trường hợp này, bạn sẽ phải đặt thủ công số cấu hình IIS6 thành 0 như được mô tả trong bài viết này .

Etags thực sự rất hữu ích vì bạn không cần phải thay đổi tên tệp như tràn ngăn xếp (tức là default.css? 1234). Nếu bạn thay đổi tệp default.css, nó sẽ thay đổi etag và do đó các yêu cầu tiếp theo sẽ lấy tệp từ máy chủ chứ không phải bộ đệm.


7
Ngày hết hạn trong tương lai xa khiến ETags không còn liên quan, vì trình duyệt sẽ không bao giờ yêu cầu lại tệp cho đến ngày được chỉ định (hoặc cho đến khi tên tệp thay đổi, tất nhiên.) Do đó, cần phải xóa nó - nó đã lỗi thời trong trường hợp đó.
Jeff Atwood 09/08/09

3
@JeffAtwood không hoàn toàn đúng, trình duyệt sẽ yêu cầu tệp nếu người dùng nhấn nút làm mới, nếu etag giống nhau, bạn nhận được 304 nếu khác bạn nhận được 200, vấn đề ở đây là bạn gửi 2 tiêu đề trong đó 1 tiêu đề có đủ
Sam Saffron

1

Tôi nghĩ điều này sẽ hoạt động .. Tôi biết loại bỏ và trống không hoạt động.

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.