What version of Next.js are you using?
10.0.7, 10.0.8-canary.3
What version of Node.js are you using?
15.8.0
What browser are you using?
curl, Chrome
What operating system are you using?
macOS
How are you deploying your application?
next start
Describe the Bug
Custom Cache-Control headers configured in next.config.js are overwritten in some cases. It looks any page that use getStaticProps will have their cache headers overwritten with Cache-Control: s-maxage=31536000, stale-while-revalidate which seems to come from
|
res.setHeader('Cache-Control', `s-maxage=31536000, stale-while-revalidate`) |
Expected Behavior
When we configure a Cache-Control header, don't set it to something else.
To Reproduce
Starting from yarn create next-app --example headers headers-app, here's a sample project that demonstrates the bug:
https://github.com/hartshorne/headers-app
You can clone the project, and run something like yarn build && yarn start to start it in production mode. (dev mode overwrites all Cache-Control headers to prevent the browser from caching during development, which makes sense.)
Here's the next.config.js: https://github.com/hartshorne/headers-app/blob/main/next.config.js
Here's props.js (which exports getStaticProps) – this is broken: https://github.com/hartshorne/headers-app/blob/main/pages/props.js
% curl -I http://localhost:3000/props
HTTP/1.1 200 OK
Cache-Control: s-maxage=31536000, stale-while-revalidate
X-Custom-Header: with static props
X-Powered-By: Next.js
ETag: "978-AzRqkosC2YfRQvbfuY7KiKb51e8"
Content-Type: text/html; charset=utf-8
Content-Length: 2424
Vary: Accept-Encoding
Date: Thu, 18 Feb 2021 22:09:41 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Here's static.js — this works: https://github.com/hartshorne/headers-app/blob/main/pages/props.js
% curl -I http://localhost:3000/static
HTTP/1.1 200 OK
Cache-Control: public, max-age=3600, s-maxage=60, stale-while-revalidate=86400
X-Custom-Header: no props, no link
X-Powered-By: Next.js
ETag: "945-MX0a4VCO/O001kyDcNn9a55taLQ"
Content-Type: text/html; charset=utf-8
Content-Length: 2373
Vary: Accept-Encoding
Date: Thu, 18 Feb 2021 22:09:10 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Note that X-Custom-Header comes through, but the Cache-Control header is overwritten. Same behavior in Chrome, and with a regular GET request.
What version of Next.js are you using?
10.0.7, 10.0.8-canary.3
What version of Node.js are you using?
15.8.0
What browser are you using?
curl, Chrome
What operating system are you using?
macOS
How are you deploying your application?
next start
Describe the Bug
Custom
Cache-Controlheaders configured innext.config.jsare overwritten in some cases. It looks any page that usegetStaticPropswill have their cache headers overwritten withCache-Control: s-maxage=31536000, stale-while-revalidatewhich seems to come fromnext.js/packages/next/next-server/server/send-payload.ts
Line 34 in 80c9522
Expected Behavior
When we configure a
Cache-Controlheader, don't set it to something else.To Reproduce
Starting from
yarn create next-app --example headers headers-app, here's a sample project that demonstrates the bug:https://github.com/hartshorne/headers-app
You can clone the project, and run something like
yarn build && yarn startto start it in production mode. (dev mode overwrites allCache-Controlheaders to prevent the browser from caching during development, which makes sense.)Here's the
next.config.js: https://github.com/hartshorne/headers-app/blob/main/next.config.jsHere's
props.js(which exportsgetStaticProps) – this is broken: https://github.com/hartshorne/headers-app/blob/main/pages/props.jsHere's
static.js— this works: https://github.com/hartshorne/headers-app/blob/main/pages/props.jsNote that X-Custom-Header comes through, but the
Cache-Controlheader is overwritten. Same behavior in Chrome, and with a regular GET request.