Next.js 메타데이터가 업데이트되지 않나요? 이유는 다음과 같습니다
코드인지 캐시인지 잘 모르겠나요?
Proovd로 무료로 확인하세요. 플랫폼의 자체 캐시와 관계없이 현재 라이브 URL이 제공하는 메타데이터가 무엇인지 정확하게 보여줍니다.
빠른 답변
- 대부분의 경우는 코드 버그가 아닌 Next.js 자체 데이터 캐시이거나 오래된 HTML을 제공하는 CDN 캐시입니다.
- 서버 구성 요소의 generateMetadata는 기본 가져오기 캐시가 재검증될 때만 다시 실행됩니다.
- 나머지는 일반적으로 Next.js가 아닌 플랫폼의 캐시(Facebook, LinkedIn 등)입니다. 둘 중 하나를 가정하기 전에 둘 다 확인하십시오.
재현 가능한 예
이는 올바른 것처럼 보이지만 콘텐츠가 변경된 후에도 오래된 메타데이터를 계속 제공합니다.
export async function generateMetadata({ params }) {
const post = await fetch(`https://api.example.com/posts/${params.slug}`).then(r => r.json());
return {
title: post.title,
openGraph: {
images: [post.image],
},
};
}
여기서 fetch 호출은 기본적으로 Next.js의 데이터 캐시에 의해 캐시됩니다. post.title 또는 post.image가 CMS에서 변경되면 이 함수는 캐시 유효성을 다시 검사할 때까지 새 값을 볼 수 없습니다. 명시적인 전략이 없으면 다음 전체 빌드까지는 불가능할 수 있습니다.
메타데이터가 업데이트되지 않는 이유
기본 가져오기가 캐시됩니다.
기본적으로 generateMetadata 내부의 fetch()는 앱 라우터에 무기한 캐시됩니다. 명시적인 재검증 기간을 설정하여 문제를 해결하세요.
const post = await fetch(url, { next: { revalidate: 60 } }).then(r => r.json());
또는 해당 요청에 대한 캐싱을 완전히 선택 해제하세요.
const post = await fetch(url, { cache: "no-store" }).then(r => r.json());
경로는 정적으로 생성됩니다.
재검증이 구성되지 않은 상태에서 경로가 generateStaticParams를 사용하는 경우 메타데이터를 포함한 전체 경로가 빌드 시 구워집니다. 페이지 수준에서 export const revalidate = 3600;를 추가하면 주기적 재생성이 강제됩니다.
CDN 또는 에지 캐시가 이전 HTML을 제공하고 있습니다.
빌드가 올바른 경우에도 Vercel의 Edge Network, Cloudflare 또는 앱 앞의 다른 CDN가 수정 사항보다 먼저 캐시된 HTML 응답을 제공할 수 있습니다. 응답 헤더를 확인하세요.
curl -I https://yoursite.com/blog/post-slug
x-vercel-cache: HIT 또는 유사한 CDN 헤더를 찾으세요. HIT는 최신 배포가 아닌 캐시된 복사본을 보고 있다는 의미입니다.
opengraph-image.ts가 새로운 데이터를 수집하지 않습니다
파일 기반 opengraph-image.ts 규칙을 사용하는 경우 Next.js는 기본적으로 빌드 시 정적 이미지를 생성합니다. 내부의 동적 콘텐츠에는 다른 서버 구성 요소와 동일한 캐싱 규칙이 적용되므로 최신 상태로 유지해야 하는 경우 명시적인 재검증을 추가하세요.
실제로는 귀하의 것이 아닌 플랫폼의 캐시입니다.
가장 흔한 허위 경보. Facebook, LinkedIn 또는 Slack가 며칠 전에 캐시된 미리보기를 계속 표시하는 동안 앱은 완전히 새로운 메타데이터를 제공할 수 있습니다. Next.js 코드를 터치하기 전에 서버가 보내는 내용을 확인하세요. 모든 플랫폼에서 OG 캐시를 지우는 방법에 대한 가이드를 참조하세요.
단계별 수정 가이드
- 실행
curl -s https://yoursite.com/page | grep -i "og:"서버가 실제로 보내는 내용을 확인하려면 curl -I https://yoursite.com/page를 사용하여 CDN 캐시HIT헤더를 확인하세요.generateMetadata내부에서 가져오려면 명시적인revalidate또는cache: "no-store"를 추가하세요.- 오래된 빌드 캐시를 배제하기 위해 새로운 배포를 강제합니다.
- Proovd로 실시간 결과를 확인하세요.
Next.js 대 다른 프레임워크
| Framework | Common cause | Fix pattern |
|---|---|---|
| Next.js (App Router) | Cached fetch inside generateMetadata, or static build with no ISR | revalidate option or cache: "no-store" |
| Astro | Client-only meta tag injection instead of static frontmatter/SSR | Move tags into the page's static output |
| SvelteKit | Meta tags set only client-side, not in the server load function | Load meta values server-side, pass to the head |
빠른 수정 체크리스트
- 확인된 원시 HTML 출력에는 올바른 태그가 있습니다(브라우저 DOM뿐만 아니라).
- generateMetadata 내부에서 가져오기 위해 명시적 재검증 또는 캐시 추가: "no-store"
- 오래된 HIT에 대해 CDN/edge 캐시 헤더를 확인했습니다.
- 경로가 ISR 없이 완전히 정적인지 확인했습니다.
- 실제 원인으로 소셜 플랫폼 자체 캐시 배제
- Proovd로 최종 라이브 출력을 확인했습니다.
자주 묻는 질문
브라우저에서는 og:image가 업데이트되지만 Facebook 또는 LinkedIn에서는 업데이트되지 않는 이유는 무엇입니까?
귀하의 Next.js 앱은 이미 올바른 태그를 제공하고 있을 가능성이 높습니다. 플랫폼은 수정 전에 캐시된 복사본을 표시합니다. 더 많은 코드를 변경하는 대신 해당 플랫폼의 자체 캐시 새로 고침 도구를 사용하십시오.
재검증: 0 캐싱을 완전히 비활성화합니까?
revalidate: 0를 설정하면 cache: "no-store"와 유사하게 모든 요청에서 가져오기에 대한 동적 렌더링을 효과적으로 강제합니다. 캐싱의 성능 이점을 제거하므로 드물게 사용하십시오.
관련 기사
귀하의 Next.js 앱이 실제로 제공하는 것이 무엇인지 확인하세요
Proovd로 실시간 메타데이터를 무료로 확인하세요. 플랫폼의 캐시와 관계없이 현재 HTML에 있는 내용을 정확하게 보여줍니다.