18

In NextJS, how can I use redirect to turn URL like /page?foo=bar into /page/bar ?

I read https://nextjs.org/docs/api-reference/next.config.js/redirects but couldn't find a solution.

What I have today is:

{
   source: '/page',
   has: [
       { 
          type: 'query',
          key: 'foo'
       }
   ],
   destination: '/page/:foo',
   permanent: true
}

but that make /page?foo=bar into /page/bar?foo=bar.

How can I drop the query ?

Edit:

So I realized that this doesn't event work at all with Netlify.

I tried to follow https://docs.netlify.com/routing/redirects/ but I have the same problem with the query parameters staying.

4
  • 2
    Does this help answer your question: NEXT JS - How to remove Query Params?? You could remove the params on the client-side with next/router. Commented Jun 25, 2021 at 18:36
  • 2
    I wanted a redirect that would convert the caught parameter as expected. The behavior is weird right now Commented Jul 5, 2021 at 8:29
  • 1
    Your question is so cool, for these kinds of problems I always make a wrapper function for routes and use it for anywhere I want to route. Commented Dec 22, 2021 at 12:44
  • router options are not good today, with app routing. Commented Sep 9 at 16:19

2 Answers 2

9
+50

You can use middleware.

Just parse the query parameter yourself and add redirection.

Store a file _middleware.ts below the pages directory:

export async function middleware(req: NextRequest) {
    const { pathname } = req.nextUrl;
    
    if (// Your-thing ) 
        return NextResponse.redirect(//Your-url);

    return NextResponse.next();
}  

Maybe there is a different way, I don't know, but it doesn't matter.

Sign up to request clarification or add additional context in comments.

Comments

3

At least when using Vercel, you can archive this by repeating the parameters from the has in the destination but leaving the value empty.

E.g.:

{
   source: '/page',
   has: [
       { 
          type: 'query',
          key: 'foo'
       }
   ],
   destination: '/page/:foo?foo=',
   permanent: true
}

Parameters that already exit in the destination won't be copied over and parameters with an empty value in the destination will be removed completely.

1 Comment

this is less worse, but still have the parameter. Thanks for pointing this out.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.