解决矛盾的Cache-Control标头

时间:2017-05-02 14:26:43

标签: javascript node.js http caching restify

我正在使用静态内容插件维护Restify服务器。尽管事先发生了任何事情,该插件仍会强加Cache-Control标题。始终包含max-age,默认为3600。

Cache-Control: public, max-age=3600

我需要为max-age以外的所有内容设置大index.html

server.pre((req, res, next) => {
    const path = url.parse(req.url);
    if (path.pathname === '/' && req.accepts('text/html')) {
        req.url = '/public/index.html';

        // Encourage the client to always download index.html.
        res.header('Expires', '0');
        res.header('Cache-Control',
            'no-store, no-cache, must-revalidate, max-age=0');
    }

    next();
});

问题是静态服务器强制添加Cache-Control会导致服务器发送相互矛盾的max-age值。

Cache-Control:no-store, no-cache, must-revalidate, max-age=0
Cache-Control:public, max-age=315360000

我尝试了一些不起作用的东西,但这是一个问题吗?我不知道浏览器是否会通过下载index.html新鲜(这是我想要的)来解决矛盾

1 个答案:

答案 0 :(得分:0)

引用Michael Krebs

  

我相信max-age = 0只是告诉缓存(和用户代理)响应从一开始就过时,所以他们应该在使用缓存之前重新验证响应(例如,使用If-Not-Modified标头)复制,而no-cache告诉他们在使用缓存副本之前必须重新验证。 From 14.9.1 What is Cacheable [...]

为简洁起见,此引文略微偏离了上下文,但规范的语言使public static double ReadInput() { double number = 0; while (true) { AssertIsDouble(Console.ReadLine()); } } private static double AssertIsDouble(string input) { double number = 0.0; if (Double.TryParse(input, out number) && number > 0) { return number; } else { Console.WriteLine("Please, input a number greater than zero (0)."); } } 成为比max-ageno-cache等更“弱”的指令。实际行为仍然存在浏览器中的实现细节,但如果must-revalidate出现在强烈指示浏览器重新验证或不缓存的指令附近,那么期望浏览器符合({{ 3}})。