Dừng IIS 7.5 từ việc gửi ra tuổi thọ tối đa kiểm soát bộ nhớ cache trên mã lỗi


10

Tôi có một số nội dung tĩnh với Max-Agecác tiêu đề kiểm soát bộ đệm được đính kèm để khách hàng sẽ lưu trữ nội dung tĩnh. Tuy nhiên, IIS 7.5 vẫn gửi tiêu đề này ra khi có phản hồi lỗi thông báo cho khách hàng lưu trữ bộ đệm này.

Điều này có tác động tiêu cực là một số proxy sau đó sẽ lưu lại phản hồi lỗi đó. Tôi có thể Vary: Accept,Accept-Encodingnhưng điều này không thực sự giải quyết vấn đề gốc của Max-Ageviệc đi ra phản hồi lỗi.

Phần IIS có liên quan hiện tại web.configlà:

<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

Có cách nào để tôi có thể làm điều đó để chúng tôi không nói với khách hàng hoặc proxy để lưu mã lỗi 400/500 không?


Bạn đang sử dụng các trang lỗi tùy chỉnh?
Justin Niessner

@Justin - Không, không phải trong trường hợp này
Nick Craver

IIS 7.0 không gửi Max-Age trên 40 * cho tôi. Tôi không chắc chắn nếu nó là một sự khác biệt giữa các phiên bản IIS.
David Murdoch

Ngoài ra, làm thế nào để buộc một nội dung tĩnh gửi mã lỗi 500?
David Murdoch

1
Ví dụ: @DavidMurdoch, chúng tôi đang thấy 406 phản hồi được gửi với các tiêu đề kiểm soát bộ đệm khi người dùng yêu cầu javascript, nhưng khách hàng chỉ chấp nhận các loại MIME hình ảnh. Các proxy đang tôn trọng chỉ thị bộ đệm này (theo thông số kỹ thuật) và những người dùng khác không thể tải xuống tập lệnh.
Jarrod Dixon

Câu trả lời:


2

Tôi đã tạo ra một "bộ" thử nghiệm thô sơ.

Khi tôi chạy thử nghiệm với một Web.config tối thiểu trên IIS 7.0 (Chế độ đường ống tích hợp trên .NET 4.0), mọi thứ đều vượt qua; Cache-Controltiêu đề phản hồi của tệp thử nghiệm được đặt thành privatekhi Accepttiêu đề của yêu cầu không khớp với tệp Content-Type.

Điều này khiến tôi tin rằng bạn có một số mô-đun làm gián đoạn thói quen lưu trữ tĩnh của IIS hoặc IIS 7.0 và 7.5 khác nhau ở đây.

Dưới đây là các tệp tôi đã sử dụng (sans some-script.jsvì nó chỉ là một tệp trống):

Web.Config:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0">
        </compilation>
    </system.web>
    <system.webServer>
        <staticContent>
            <!-- Set expire headers to 30 days for static content-->
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
        </staticContent>
    </system.webServer>
</configuration>

test.html:

<!doctype html>
<html>
<head>
    <title>http://serverfault.com/questions/346975</title>
    <style>
        body > div
        {
            border:1px solid;
            padding:10px;
            margin:10px;
        }
    </style>
</head>
    <body>
        <div>
            <h2>Request JS file with Accepts: accept/nothing</h2>
            <b>Response Headers: </b>
            <pre id="responseHeaders-1">loading&hellip</pre>
        </div>

        <div>
            <h2>Request JS file with Accepts: */*</h2>
            <b>Response Headers: </b>
            <pre id="responseHeaders-2">loading&hellip</pre>
        </div>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
        <script>
            var responseHeaders1 = $("#responseHeaders-1"),
                responseHeaders2 = $("#responseHeaders-2"),
                fetchScript = function (accepts, element, successMsg, errorMsg) {

                    var jXhr = $.ajax({
                        // fetch the resource "fresh" each time since we are testing the Cache-Control header and not caching itself
                        "url": "some-script.js?" + (new Date).getTime(),
                        "headers": {
                            "Accept" : accepts
                        },
                        "complete": function () {
                            var headers = jXhr.getAllResponseHeaders();
                            headers = headers.replace(/(Cache-Control:.+)/i, "<strong><u>$1</u></strong>");
                            element.html(headers);
                        },
                        "success": function () {
                            element.after("<div>" + successMsg + "</div>");
                        },
                        "error": function () {
                            element.after("<div>" + errorMsg + "</div>");
                        }
                    });
                };

                fetchScript("accept/nothing", responseHeaders1, "Uh, your server is sending stuff when the client doesn't accept it.", "Your server (probably) responded correctly.");
                fetchScript("*/*", responseHeaders2, "Your server responded correctly.", "Something went wrong.");
        </script>
    </body>
</html>

Chúng tôi có thể sao chép phát hiện của bạn bằng cách sử dụng các yêu cầu đến localhost - bạn đã thử thực hiện các thử nghiệm tương tự từ một máy từ xa chưa?
Geoff Dalgas

Vâng, tôi đã làm. se.vervestudios.co/tests/se-test/test.html (lưu ý với những người trong tương lai, liên kết trước đó chỉ dành cho mục đích thử nghiệm tạm thời và có lẽ không hoạt động nữa, xin lỗi)
David Murdoch

Lỗi được nhúng trong phản hồi đó cho thấy một số thông tin có phần rủi ro - xem tại đây . Dường như máy chủ của bạn tin rằng tất cả các yêu cầu được phát hành cục bộ - xem: iis.net/ConfigReference/system.webServer/httpErrors Nếu bạn bật CustomErrors qua: <httpErrors errorMode = "Custom" /> bạn sẽ thấy vấn đề tương tự chúng tôi đang gặp phải @ David
Geoff Dalgas

0

bạn nên chỉ định loại nội dung bạn sẽ lưu vào bộ đệm. ví dụ, bạn có thể lưu trữ tập lệnh, css, hình ảnh ..v.v. vì vậy sử dụng <location path ="Scripts">thẻ trước <system.webServer>thẻ. Vì vậy, cấu hình web của bạn trông như thế này.

 <location path ="Scripts">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="07:00:00" />
      </staticContent>
    </system.webServer>
  </location>
  <location path ="css">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="07:00:00" />
      </staticContent>
    </system.webServer>
 </location>

Điều đó thực sự giải quyết câu hỏi này?
gà con
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.