Home > database >  Netlify _redirects file not working as expected
Netlify _redirects file not working as expected

Time:10-22

I have my _redirects file in the public folder of my react app and I added a redirect rule /* /index.html 200, which works perfectly.

Then I added another rule to proxy my app to my api server /api/* https://tseapi.herokuapp.com/ 200! it doesn't work.

the whole file looks like this

/*   /index.html  200
/api/* https://api.com/ 200!

As I stated, the global redirect /* overrules the /api/* and I couldn't get it to work.

NOTE: I have tried rearranging them like this

/api/* https://api.com/ 200!
/*   /index.html  200

and in this case, the app get's stuck on 'page not found'

CodePudding user response:

NOTE: I have tried rearranging them like this

/api/* https://api.com/ 200!
/*   /index.html  200

and in this case, the app get's stuck on 'page not found'

You are stuck at 404 beacuse https://api.com/ handles home route as a 404 from your backend(when your url in Browser address bar is like: /api/blah/blah).

With this rule /api/* https://api.com/ 200!, the asterisk (*) on /api is used to indicate anything that follows /api/ to be matched to https://api.com/(home route).

This is a problem because what you want is https://api.com/ matched to anything that followed /api/ as well, for example;
/api/blog/2010 should be matched to https://api.com/blog/2010.
But the current behaviour is /api/blog/2010 is matched to https://api.com/

Solution

This is how your _redirect file should look like:

/api/* https://api.com/:splat 200!
/* /index.html  200

You need to specify splat.
Using an asterisk on the from URL(/api/*), you also need to indicate a splat on the to URL(https://api.com/:splat) that will map to anything that follows /api/*. So a URL like /api/blog/2010 will be written to https://api.com/blog/2010

Bonus

The Netlify redirects engine will process the first matching rule it finds, reading from top to bottom.

So an ordering like:

/* /index.html  200
/api/* https://api.com/:splat 200!

Means that the first redirect rule(/* /index.html 200) will process since it always matches. The second one(/api/* https://api.com/:splat 200!) won’t be hit it, even when browser address bar is like /api/blah/blah. Even if you have ! on a rule, the order of redirects is still followed.

More specific rules should be defined at the top. As shown:

/api/* https://api.com/:splat 200!
/* /index.html  200
  • Related