Next.js
검색 결과에 오래된 페이지가 남을 때 canonical과 리다이렉트를 나눈 기준
URL 구조 변경 뒤 canonical, 301, noindex를 구분해 적용한 SEO 판단 가이드입니다.
canonical만으로 해결되지 않았다
글 slug 규칙을 바꾸자 검색 결과에 구주소와 신주소가 함께 보였다. 신주소에 canonical을 넣었지만 클릭한 사용자를 이동시키지는 않았다. 대표 URL을 알리는 일과 사용자를 새 주소로 보내는 일을 따로 봐야 했다.
상황별 선택표
| 상황 | 선택 | 목적 |
|---|---|---|
| 같은 내용의 주소가 여럿 | canonical | 대표 주소 제안 |
| 페이지가 영구 이동 | 301 | 방문자와 크롤러 이동 |
| 페이지는 유효하지만 검색 제외 | noindex | 색인 제외 요청 |
구 slug가 새 글로 완전히 이동한 경우에는 301을 반환했다. 새 페이지에는 자기 자신을 canonical로 넣었다.
import { permanentRedirect } from 'next/navigation';
export async function GET(request, { params }) {
const post = await findPostByOldSlug(params.slug);
if (!post) return new Response('Not Found', { status: 404 });
permanentRedirect(`/posts/${post.slug}`);
}
export async function generateMetadata({ params }) {
const post = await getPost(params.slug);
return { alternates: { canonical: `https://example.com/posts/${post.slug}` }, title: post.title };
}
배포 후 실제로 본 신호
curl -I https://example.com/posts/old-slug
curl -I https://example.com/posts/new-slug
curl -s https://example.com/sitemap.xml | grep '/posts/'
curl -s https://example.com/posts/new-slug | grep -i canonical
redirect가 맞아도 sitemap, 내부 링크, RSS에 옛 주소가 남으면 신호가 섞인다. 모두 대표 URL로 바꾸고 redirect 체인이 두 단계가 되지 않았는지 확인했다.
기억할 판단 질문
이 주소는 복사본인가, 영구 이동인가? 사용자가 접근할 실제 페이지가 있는가? sitemap이 대표 주소만 가리키는가? HTML에 canonical이 렌더링되는가?
검색엔진의 갱신 시점은 기다려야 하지만, 이동·대표성·사이트맵을 일관되게 맞추는 일은 바로 할 수 있다.