workflow_dispatch
를 이용하여 해결static export
에서는 dynamic routing을 사용하기 위해서 generateStaticParams를 사용해야 한다 // src/app/(root)/blog/[slug]/page.tsx
export async function generateStaticParams() {
const { data: posts } = await api.post.getPostList();
return posts
? posts.map((post) => ({
slug:
process.env.NODE_ENV === 'development'
? encodeURI(post.slug)
: post.slug,
}))
: [];
}
SNS 공유 시 미리보기
generateMetadata
를 이용해서 블로그 페이지는 동적인 오픈그래프가 나오도록 하였다.
// src/app/(root)/blog/[slug]/page.tsx
export const generateMetadata = async ({
params: { slug },
}: DetailPageParams): Promise<Metadata> => {
const decodedSlug = decodeURI(slug);
const { data: post } = await api.post.getPostDetailBySlug(decodedSlug);
return {
openGraph: {
title: decodedSlug,
description: post
? truncateString(extractContent(post.content), 100)
: '존재하지 않는 게시물입니다.',
url: `https://searchright.net/blog/${decodedSlug}`,
images:
post?.thumbnail || 'https://searchright.net/static/landing_meta.png',
type: 'website',
locale: 'ko_KR',
},
};
};
검색엔진 크롤러(또는 검색 로봇)가 액세스 하거나 정보수집을 해도 되는 페이지가 무엇인지, 해서는 안 되는 페이지가 무엇인지 알려주는 역할을 하는 .txt (텍스트) 파일
User-agent: Yeti
Disallow: /not-for-naver/
Sitemap: http://www.example.com/sitemap.xml
항상 사이트의 루트 디렉터리에 위치해야 함
사용하는 이유
sitemap.xml
)의 위치를 제공하여 웹사이트의 콘텐츠가 검색엔진에게 더 잘 발견될 수 있도록 하기 위해서구성
💡 Allow는 Disallow 보다 우선권을 가지므로 아래의 경우 Disallow는 무효화된다.
User-agent: Yeti Disallow: /folder-depth-1/folder-depth-2/ Allow: /
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
robots.txt 설정하기 | 네이버 서치어드바이저
robots.txt 10분 안에 끝내는 총정리 가이드 | Yoobin Hwang
https://www.sitemaps.org/protocol.html
Next.js에서는 typescript를 이용해서 robots.txt와 sitemap.xml 파일을 만드는 기능을 제공한다 (넥스트 최고 👍)
https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots
https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap