Backend Technology

How to redirect POST requests in Apache & Nginx

Migrating an API? Learn how to properly redirect POST requests.

When you move content, change domains or create aliases on the web, you often use a redirect, like a URL rewrite in your webserver config, to tell browsers that the link should point to something else — but what if you want to move an API that handles POST requests?

URL rewrites are useful, because you can tell the browser to change only a specific part of the original link, like the domain, but keep the rest intact. It’s particularly useful when you move your blog to a different address, but want to keep all the permalinks working.

However, if you are migrating an API things get tricky. Normally, rewrites work on the URL level and drop the request body, which contains POST values. With URL rewrites, your migrated API looks like working but in fact can’t receive any POST payload — redirect POST requests won’t work with your usual 301/302 URL rewrite redirects!

Luckily there’s a simple solution to this problem. Many people suggest configuring a POST-forwarding proxy on your webserver, but that’s not optimal. Your best option is to use a 307 Redirect.

In Apache, the syntax is as follows:

Redirect 307 /old(.*)$1

While in Nginx it’s as follows:

location ~* /old {
  return 307$request_uri;

Note: HTTP Code 307 is a temporary redirect. The 308 is permanent, however it’s a newer code and some old browsers or libs may not support it.

By Marek

I graduated Oxford University Computing Laboratory in 2008 and since then have been a full-stack lead on many projects, in different technologies. Myself, I like to code in Perl, Solidity and JavaScript, run on Debian & Nginx, design with Adobe CC & Affinity and work remotely, but overall I always do whatever gets the job done. I like to learn new things all the time!

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.