From 8f133cbf54644ff2aecbe62387901b36e94dd1f7 Mon Sep 17 00:00:00 2001 From: "James M. Greene" Date: Tue, 2 Feb 2021 15:37:41 -0600 Subject: [PATCH] Disallow both Fastly AND the browser from caching HTML pages (#17641) --- middleware/index.js | 4 +++- middleware/set-fastly-cache-headers.js | 10 +++++----- tests/rendering/server.js | 9 +++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/middleware/index.js b/middleware/index.js index ab25a2bfa6..19559b8d7e 100644 --- a/middleware/index.js +++ b/middleware/index.js @@ -38,7 +38,6 @@ module.exports = function (app) { // *** Headers *** app.use(require('compression')()) - app.use(require('./set-fastly-cache-headers')) app.use(require('./disable-caching-on-safari')) // *** Config and context for redirects *** @@ -93,6 +92,9 @@ module.exports = function (app) { app.use(instrument('./featured-links')) app.use(instrument('./learning-track')) + // *** Headers for pages only *** + app.use(require('./set-fastly-cache-headers')) + // *** Rendering, must go last *** app.get('/*', asyncMiddleware(instrument('./render-page'))) app.use(require('./handle-errors')) diff --git a/middleware/set-fastly-cache-headers.js b/middleware/set-fastly-cache-headers.js index f76d84496c..5059487198 100644 --- a/middleware/set-fastly-cache-headers.js +++ b/middleware/set-fastly-cache-headers.js @@ -1,12 +1,12 @@ const FASTLY_TTL = process.env.FASTLY_TTL || String(60 * 60 * 24) // 24 hours const STALE_TTL = String(60 * 10) // 10 minutes -const BYPASS_FASTLY = process.env.TEST_BYPASS_FASTLY === 'true' -const BYPASS_PRODUCTS = /^\/([a-z]{2})\/([a-z0-9._-]+@[a-z0-9._-]+\/)?github(\/.*|$)/i - module.exports = (req, res, next) => { - // Test bypassing Fastly for all pages inside of the Discussions product - if (BYPASS_FASTLY && !BYPASS_PRODUCTS.test(req.originalUrl)) { + const BYPASS_FASTLY = process.env.TEST_BYPASS_FASTLY === 'true' + + // Bypass Fastly caching for all rendered pages + if (BYPASS_FASTLY) { + // Disallow both Fastly AND the browser from caching HTML pages res.set({ 'surrogate-control': 'private, no-store', 'cache-control': 'private, no-store' diff --git a/tests/rendering/server.js b/tests/rendering/server.js index bed0132490..5686efca73 100644 --- a/tests/rendering/server.js +++ b/tests/rendering/server.js @@ -66,6 +66,15 @@ describe('server', () => { expect(res.headers['surrogate-key']).toBe('all-the-things') }) + test('sets Fastly cache control headers to bypass if enabled', async () => { + process.env.TEST_BYPASS_FASTLY = 'true' + + const res = await get('/en') + expect(res.headers['cache-control']).toBe('private, no-store') + expect(res.headers['surrogate-control']).toBe('private, no-store') + expect(res.headers).not.toHaveProperty('surrogate-key') + }) + test('does not render duplicate or tags', async () => { const $ = await getDOM('/en') expect($('html').length).toBe(1)