Best Practices for Mastering Next.js Redirects

This blog post dives into the recommended practices for implementing redirects within your Next.js applications, illustrated with code samples for better understanding.

Choosing Your Weapon

Next.js offers three primary methods for redirection:

  • redirect function
  • useRouter hook
  • next.config.js

Matching the Tool to the Task:

  • Server-side Redirects (e.g., from getStaticProps):

export async function getStaticProps() {
  // Perform data fetching (optional)
  return {
    props: {},
    redirect: {
      destination: '/about', // Redirect to the about page
      permanent: false, // Set to true for permanent redirect (optional)
    },
  };
}

  • Client-side Redirects (e.g., button click):
import { useRouter } from 'next/router';

function MyComponent() {
  const router = useRouter();

  const handleClick = () => {
    router.push('/contact'); // Redirect to the contact page on button click
  };

  return (
    <button onClick={handleClick}>Contact Us</button>
  );
}

  • Multiple Redirects in next.config.js:
// next.config.js
module.exports = {
  redirects: async () => [
    {
      source: '/old-page',
      destination: '/new-page',
      permanent: true, // Permanent redirect for old page
    },
    {
      source: '/another-old-page',
      destination: '/about',
      permanent: false, // Temporary redirect for another old page
    },
  ],
};

Pro Tips:

  • Absolute Paths: Always use absolute URLs within the redirect function:

redirect('/about'); // Correct usage
// Not allowed: redirect('./about'); 

  • Custom Middleware (advanced):

Create a middleware file (e.g., middleware.js) to handle complex redirection logic.

// middleware.js
export function middleware(req) {
  // Implement your custom logic here
  // Example: Check for a specific cookie and redirect if needed
  if (!req.cookies.loggedIn) {
    return { redirect: { destination: '/login' } };
  }
  return NextResponse.next();
}

// In `pages/_app.js`
import { middleware } from './middleware';

function MyApp({ Component, pageProps }) {
  return (
    <ChakraProvider>
      <GlobalProvider theme={theme}>
        <Layout>
          <Component {...pageProps} />
        </Layout>
      </GlobalProvider>
    </ChakraProvider>
  );
}

export default MyApp;

export async function getServerSideProps(context) {
  const middlewareResponse = await middleware(context);
  if (middlewareResponse) {
    return middlewareResponse;
  }

  // Fetch data or perform other actions
  return { props: {} };
}

Additional Considerations:

By following these best practices and utilizing the code samples provided, you can effectively implement redirects in your Next.js applications, ensuring a seamless user experience.