next.jsをS3+CloudFrontにデプロイした時に、Dynamic Routesを処理する方法

kyamada,next.jss3cloudfront

next.js で作ったアプリを S3+CloudFront にデプロイする場合、Dynamic Routes (opens in a new tab)を処理するには以下の作業が必要です。

pages/404.tsx

pages/404.tsx を作成し、以下のコードを作成します。

pages/404.tsx
import { NextPage } from 'next'
import Router from 'next/router'
import { useEffect, useState } from 'react'
 
// S3 + CloudFront構成でデプロイする場合は、CloudFrontで以下のカスタムエラーレスポンスを作成する必要があります
// - HTTPエラーコード: 404
// - レスポンスのページパス: /404/index.html
// - HTTPレスポンスコード: 200
//
// 参考: https://github.com/vercel/next.js/discussions/17711#discussioncomment-323735
const Custom404: NextPage = () => {
  const [isNotFound, setIsNotFound] = useState(false)
 
  useEffect(() => {
    const pathNames = window.location.pathname.split('/')
    // /post/[pid] を処理する場合
    if (pathNames[1] === 'posts') {
      Router.replace(window.location.pathname)
    } else {
      setIsNotFound(true)
    }
  }, [])
 
  if (isNotFound) return <h1>404 - Page Not Found</h1>
 
  return null
}
 
export default Custom404

CloudFront でカスタムエラーレスポンスを作成

AWS コンソールから、CloudFront のカスタムエラーレスポンスを作成します。

© 品川アプリ.RSS