阻止IIS 7.5在错误代码上发送缓存控制最大年龄


10

我有一些Max-Age附加了缓存控制标头的静态内容,因此客户端将缓存静态内容。但是,当有错误响应建议客户端对其进行缓存时,IIS 7.5仍会发送此标头。

这具有负面影响,即某些代理随后将缓存该错误响应。我可以,Vary: Accept,Accept-Encoding但这不能真正解决Max-Age错误响应的根本问题。

当前相关的IIS web.config部分是:

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

有没有办法让我做到这一点,使我们不告诉客户或代理缓存400/500错误代码?


您是否正在使用自定义错误页面?
贾斯汀·尼斯纳

@贾斯汀-不,在这种情况下不
尼克·克雷弗

IIS 7.0不会为我发送40 *的Max-Age。我不确定IIS版本之间是否存在差异。
David Murdoch

另外,如何强制静态内容发送500个错误代码?
David Murdoch 2012年

1
以@DavidMurdoch为例,当用户请求javascript时,我们看到406个带有缓存控制标头的响应,但客户端仅接受图像MIME类型。代理正在遵守此缓存指令(按照规范,它们应该这样做),其他用户无法下载该脚本。
Jarrod Dixon

Answers:


2

我创建了一个基本测试“套件”。

当我在IIS 7.0上以最小的Web.config运行测试时(.NET 4.0上的集成点模式),所有测试都通过了;测试文件的Cache-Control响应标头设置为private请求的Accept标头与文件的标头不匹配时Content-Type

这使我相信您有一些模块会中断IIS的静态缓存例程,或者IIS 7.0和7.5在这里有所不同。

这是我使用的文件(some-script.js因为它只是一个空文件,所以没有):

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>

我们可以使用对localhost的请求来重现您的发现-您是否尝试过从远程计算机进行相同的测试?
杰夫达尔加斯

是的,我做到了。se.vervestudios.co/tests/se-test/test.html(向未来的人们说明,以前的链接仅用于临时测试,对不起,对不起)
David Murdoch 2012年

该响应中嵌入的错误暴露了一些风险较大的信息-请参见此处。看来您的服务器认为所有请求都是在本地发出的-请参阅: iis.net/ConfigReference/system.webServer/httpErrors 如果通过以下方式启用CustomErrors:<httpErrors errorMode =“ Custom” />,您将看到与@相同的问题大卫
杰夫·达尔加斯

0

您应该指定要缓存的内容类型。例如,您可以缓存脚本,css,图像等。因此请在<location path ="Scripts">标签之前使用<system.webServer>标签。因此您的网络配置如下所示。

 <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>

这真的解决了这个问题吗?
小鸡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.