-
Notifications
You must be signed in to change notification settings - Fork 29.3k
Description
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.