Skip to content

feat: add logging to understand impact of trailing slash 308s #2743

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/run/handlers/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export default async (request: Request) => {

await adjustDateHeader({ headers: response.headers, request, span, tracer, requestContext })

setCacheControlHeaders(response, request, requestContext)
setCacheControlHeaders(response, request, requestContext, nextConfig)
setCacheTagsHeaders(response.headers, requestContext)
setVaryHeaders(response.headers, request, nextConfig)
setCacheStatusHeader(response.headers)
Expand Down
10 changes: 9 additions & 1 deletion src/run/headers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { NextConfigComplete } from 'next/dist/server/config-shared.js'

import { encodeBlobKey } from '../shared/blobkey.js'

import type { RequestContext } from './handlers/request-context.cjs'
import { getLogger, RequestContext } from './handlers/request-context.cjs'
import type { RuntimeTracer } from './handlers/tracer.cjs'
import { getRegionalBlobStore } from './regional-blob-store.cjs'

Expand Down Expand Up @@ -216,6 +216,7 @@ export const setCacheControlHeaders = (
{ headers, status }: Response,
request: Request,
requestContext: RequestContext,
nextConfig: NextConfigComplete,
) => {
if (
typeof requestContext.routeHandlerRevalidate !== 'undefined' &&
Expand All @@ -234,6 +235,13 @@ export const setCacheControlHeaders = (
return
}

// temporary diagnostic to evaluate number of trailing slash redirects
if (status === 308 && request.url.endsWith('/') !== nextConfig.trailingSlash) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we perhaps also check if Location header and request.url pathnames are almost the same and only diff is that one of those would have trailing slash to limit potential false positives?

Conceptually there could other redirects that would fall into this condition that are not related to trailing slash redirects (tho not sure about exact details)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I thought about that, but then I couldn't think of any other redirects that would fall into this condition. It's impossible to configure user redirects that don't match the trailing slash settings and I couldn't think of any others. Did you have any specific in mind?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe redirects to external domains/targets could have this characteristic possibly next skipping trailing slash handling if target is external, but as I mentioned - I don't have any concrete scenario in mind, so we can skip this if this is already something you thought about

getLogger()
.withFields({ trailingSlash: nextConfig.trailingSlash })
.log('NetlifyHeadersHandler.trailingSlashRedirect')
}

if (status === 404 && request.url.endsWith('.php')) {
// temporary CDN Cache Control handling for bot probes on PHP files
// https://linear.app/netlify/issue/FRB-1344/prevent-excessive-ssr-invocations-due-to-404-routes
Expand Down
Loading