Hentikan IIS 7.5 Dari Mengirim Cache-Control Max-Age pada Kode Kesalahan

10

Saya memiliki beberapa konten statis dengan Max-Ageheader kontrol cache yang terpasang sehingga klien akan melakukan cache konten statis. Namun, IIS 7.5 masih mengirimkan header ini ketika ada respons kesalahan yang menyarankan klien untuk melakukan cache ini.

Itu memiliki efek negatif bahwa beberapa proksi kemudian akan men-cache respons kesalahan itu. Saya bisa Vary: Accept,Accept-Encodingtetapi ini tidak benar-benar mengatasi masalah root Max-Agekeluar pada respons kesalahan.

Bagian IIS yang relevan saat ini web.configadalah:

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

Apakah ada cara agar saya dapat membuatnya sehingga kami tidak memberi tahu klien atau proksi untuk me-cache kode kesalahan 400/500?

Kyle Brandt
sumber
Apakah Anda menggunakan halaman kesalahan khusus?
Justin Niessner
@Justin - Tidak, tidak dalam kasus ini
Nick Craver
IIS 7.0 tidak mengirim Max-Age pada 40 * untuk saya. Saya tidak yakin apakah ini perbedaan antara versi IIS.
David Murdoch
Juga, bagaimana seseorang memaksa konten statis untuk mengirim kode kesalahan 500?
David Murdoch
1
@DavidMurdoch misalnya, kita melihat 406 respons dikirim dengan tajuk kontrol cache ketika pengguna meminta javascript, tetapi klien hanya menerima tipe MIME gambar. Proxy menghormati arahan caching ini (sebagaimana mestinya, berdasarkan spesifikasi) dan pengguna lain tidak dapat mengunduh skrip.
Jarrod Dixon

Jawaban:

2

Saya membuat "suite" uji dasar.

Ketika saya menjalankan tes dengan Web.config minimal pada IIS 7.0 (mode pipeline terintegrasi pada. NET 4.0) semuanya berlalu; Cache-Controlheader respons file tes diatur ke privatesaat Acceptheader permintaan tidak cocok dengan file Content-Type.

Ini membuat saya percaya bahwa Anda memiliki beberapa modul yang mengganggu rutin caching statis IIS atau IIS 7.0 dan 7.5 berbeda di sini.

Berikut adalah file yang saya gunakan (tanpa some-script.jsfile yang kosong):

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>
David Murdoch
sumber
Kami dapat mereproduksi temuan Anda menggunakan permintaan ke localhost - pernahkah Anda mencoba melakukan tes yang sama dari mesin jarak jauh?
Geoff Dalgas
Ya saya lakukan. se.vervestudios.co/tests/se-test/test.html (catatan untuk orang-orang di masa depan, tautan sebelumnya hanya untuk tujuan pengujian sementara dan mungkin tidak berfungsi lagi, maaf)
David Murdoch
Kesalahan yang tertanam dalam respons itu memperlihatkan beberapa informasi yang agak berisiko - lihat di sini . Tampaknya server Anda yakin semua permintaan dikeluarkan secara lokal - lihat: iis.net/ConfigReference/system.webServer/httpErrors Jika Anda mengaktifkan CustomErrors melalui: <httpErrors errorMode = "Custom" /> Anda akan melihat masalah yang sama dengan yang kami alami @ David
Geoff Dalgas
0

Anda harus menentukan jenis konten apa yang akan Anda cache. misalnya Anda bisa men-cache Script, css, image ..etc. jadi gunakan <location path ="Scripts">tag sebelum <system.webServer>tag. jadi konfigurasi web Anda terlihat seperti ini.

 <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>
Asanga Ambagaspitiya
sumber
Apakah itu benar-benar menjawab pertanyaan ini?
anak ayam