Next.js์์ ๋์์ด ๋์ด ์์ง ์์ `/` path๋ก ์ง์ ํ์ ๋ default `/home` page๋ก redirect ํ๋ ์คํ์ ๊ตฌํํด์ผ ํ๋ค.
Redirect ์ ์ฌ์ฉํ๋ ์ํ์ฝ๋
Next.js์์์ redirect ๋ฅผ ๊ตฌํํ๊ธฐ ์ redirect ์์ ์๋ฒ์์ ๋ฐํํ๋ ์ํ์ฝ๋๋ฅผ ๋จผ์ ์ดํด๋ณด์.
300๋ฒ ๋์ ์ํ์ฝ๋๋ ๋ชจ๋ Redirection ์ ์๋ฏธํ๋ฉฐ, 300 ~ 308 ๊น์ง ์๋ค.
- 301 (Moved Permanently) : ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋๋ฅผ GET ์ผ๋ก ๋ฐ๊พธ๋ฉฐ, redirect ์ฒ๋ฆฌ๊ฐ ์บ์ฑ๋๋ค.
- 302 (Found - Moved Temporarily) : ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋๋ฅผ GET ์ผ๋ก ๋ฐ๊พธ๋ฉฐ, redirect ์ฒ๋ฆฌ๊ฐ ์ผ์์ ์ด๊ณ ์บ์ฑ๋์ง ์๋๋ค.
- 304 (Not Modified) : ๋ง์ง๋ง ์์ฒญ ์ดํ ์๋ต์ด ๋ฐ๋์ง ์์์ ๋
- 307 (Temporary Redirect) : ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ, redirect ์ฒ๋ฆฌ๊ฐ ์ผ์์ ์ด๊ณ ์บ์ฑ๋์ง ์๋๋ค.
- 308 (Permanent Redirect) : ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ, redirect ์ฒ๋ฆฌ๊ฐ ์บ์ฑ๋๋ค.
304๋ฅผ ์ ์ธํ๊ณ (301๊ณผ 308), (302์ 307)์ด ๋ฎ์์๋๋ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋๋ฅผ ๋ฐ๊พธ๋๋ ์๋๋์ ๋ฐ๋ผ ๊ตฌ๋ถ๋๋ค.
Next.js ์์ Redirect ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
Next.js ์์ redirect ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ 3๊ฐ์ง๊ฐ ์๋ค.
next.config.js ํ์ผ์์ redirects ํจ์๋ฅผ ์ธํ ํ๋ค.
๊ณต์ ์ฌ์ดํธ์ ๊ธฐ์ฌ๋์ด ์๋ ๋ฐฉ๋ฒ์ผ๋ก next config ํ์ผ์ redirects ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ค.
module.exports = {
async redirects() {
return [
{
source: '/',
destination: '/home',
permanent: true,
},
]
},
}
source ๋ก ๋ค์ด์จ ์ ์ ๋ฅผ destination ์ผ๋ก redirect ์์ผ์ฃผ๋ฉฐ, Parmanent ๋ฅผ true๋ก ์ธํ ํ๋ฉด 308 ์ํ์ฝ๋๋ฅผ / false๋ก ์ธํ ํ๋ฉด 307 ์ํ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค. ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ธฐ ์ํด 301, 302๋ ์ฌ์ฉํ์ง ์๋๋ค. dynamic path๋ฅผ ๋์ํ๊ธฐ ์ํด ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, regex ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ฌ์ง์ด ์ฟ ํค๋ ํค๋, ์ฟผ๋ฆฌ์ ์ํ์ ๋ฐ๋ผ redirect ๊ฐ ๋์ํ๋๋ก ์ธํ ํ ์๋ ์๋ค. ์์ธํ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์.
ํ์ด์ง ์ปดํฌ๋ํธ ํ์ผ์ ํด๋ผ์ด์ธํธ ์ฝ๋ ์์์ next router์ ํจ์๋ก ์ด๋ํ๋ค.
2-1. next.js ๋ฒ์ 13 ์ด์์ผ ๊ฒฝ์ฐ
๊ณต์ ์ฌ์ดํธ์ ๊ธฐ์ฌ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋ฒ์ 13 ์ดํ์ ์๊ธด next/navigation ์ redirect ํจ์๋ฅผ ์ด์ฉํ ์ ์๋ค.
import { redirect } from 'next/navigation';
export default function Default() {
redirect('/home');
// permanentRedirect('/home');
}
์ด ๋ํ 307 ์ํ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, permanentRedirect ๋ฅผ ์ด์ฉํ๋ฉด 308 ์ํ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
2-2. next.js ๋ฒ์ 13 ๋ฏธ๋ง์ผ ๊ฒฝ์ฐ
๊ณต์ ์ฌ์ดํธ์ ๊ธฐ์ฌ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋ฒ์ 13 ์ด์ ์ ๊ฒฝ์ฐ next/router ์ replace ํจ์๋ฅผ ์ด์ฉํ ์ ์๋ค.
import { useRouter } from 'next/router';
export default function Default() {
const router = useRouter();
router.replace('/home');
return null;
}
`/` path์ ํด๋นํ๋ ํ์ด์ง ์ปดํฌ๋ํธ์ธ `pages/index.js` ๋ฅผ ๋ง๋ ํ ํด๋น ํ์ด์ง์์ router.replace ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค. ์ด ๊ฒฝ์ฐ ์๋ฒ๊ฐ redirect ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๊ฒ์ด ์๋ ํด๋ผ์ด์ธํธ์์ GET ์์ฒญ์ 2๋ฒ ํ ๊ฒ์ด ๋๋ค.
ํ์ด์ง ์ปดํฌ๋ํธ ํ์ผ์ ์๋ฒ ์ฝ๋ ์์์ ctx.res ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ํ๋ค.
ํ์ด์ง ์ปดํฌ๋ํธ์ getServerSideProps ๋ getStaticProps ํจ์ ๋ด๋ถ์์ ctx.res ๋ฅผ ์ด์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ ๋๋ฌํ๊ธฐ ์ ์ redirect ์ํฌ ์ ์๋ค.
const NotFound = () => {
return null;
};
export async function getServerSideProps({ res }) {
res.writeHead(302, { Location: '/home' });
res.end();
return {
props: {}, // you can return props if needed
};
}
export default NotFound;
App.tsx ์ getInitialProps ์์ ctx.res ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ํ๋ค.
App.getInitialProps = async ({ ctx }: AppContext) => {
const { res } = ctx;
res?.writeHead(307, { Location: '/404' });
res?.end();
return {};
}
ํ์ง๋ง getInitialProps ๋ ํจ์ ํธ์ถ ์์ ์ด ๋ช ํํ์ง ์์ Legacy API์ด๋ฏ๋ก ๋๋๋ก์ด๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค. (๊ณต์ ๋ฌธ์ ์ฐธ๊ณ )
ํด๋ผ์ด์ธํธ ์๋ฒ ์ฝ๋์์ res.redirect ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ํ๋ค.
import express from 'express';
const app = express();
app.get('/', (_, res) => {
res.redirect(307, '/home');
});
์ด์ ๋ฆฌ & ์ถ์ฒ
- next.config.js ์ธํ โ
- ํ์ด์ง ์ปดํฌ๋ํธ ์ฝ๋ ์์์ ์ด๋ -> Redirect ๋ก ํ์๋์ง ์์ผ๋ฏ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
- getServerSideProps / getStaticProps ์์ ์ด๋ โ
- getInitialProps ์์ ์ด๋ -> Legacy API ์ด๋ฏ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
- ํด๋ผ์ด์ธํธ ์๋ฒ ์ฝ๋์์ ์ด๋ โ
1, 3, 5๋ฒ์ด ๋ชจ๋ ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ 5 > 1 > 3 ์ ์ฐ์ ์์๋ก ์ ์ฉ๋๋ค.
Redirect ๋ ์ฌ๋งํ๋ฉด ๊ธฐ์กด ํ์ด์ง์ ์ํฅ์ด ์๊ธฐ ์ ์ ์ํ๋๋ ๊ฒ์ด ์ข๊ธฐ ๋๋ฌธ์ ์ฐ์ ์์ ์์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ํ์ง๋ง 1์ ๊ฒฝ์ฐ ์ํ์ฝ๋๋ฅผ 301, 302 ๋ก ์ง์ ํ ์ ์์์ ์ ์ํด์ผ ํ๋ค.
๋ํด์ SEO์ ๊ดํ์ฌ 301์ ์ํ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด URL๊ณผ ์๋ก์ด URL์ ๋์ผ์ํ์ฌ ๊ถํ ๋ฐ ๊ด๋ จ์ฑ ์ ์ง์ ๋์์ด ๋๋ค. ํ์ง๋ง ๊ผญ 301๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ ์ํฉ์ ๋ง๋ ์ํ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
Comment