CURLOPT\_POSTREDIR(3) Library Functions Manual CURLOPT\_POSTREDIR(3)

# [NAME](#NAME)

CURLOPT\_POSTREDIR - how to act on an HTTP POST redirect

# [SYNOPSIS](#SYNOPSIS)

```
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTREDIR,


                          long bitmask);
```

# [DESCRIPTION](#DESCRIPTION)

Pass a bitmask to control how libcurl acts on redirects after POSTs that get a 301, 302 or 303 response back. A parameter with bit 0 set (value **CURL\_REDIR\_POST\_301**) tells the library to not convert POST requests into GET requests when following a 301 redirection. Setting bit 1 (value **CURL\_REDIR\_POST\_302**) makes libcurl maintain the request method after a 302 redirect whilst setting bit 2 (value **CURL\_REDIR\_POST\_303**) makes libcurl maintain the request method after a 303 redirect. The value **CURL\_REDIR\_POST\_ALL** is a convenience define that sets all three bits.

The non-RFC behavior is ubiquitous in web browsers, so the library does the conversion by default to maintain consistency. A server may require a POST to remain a POST after such a redirection. This option is meaningful only when setting [*CURLOPT\_FOLLOWLOCATION(3)*](/man/os/curl/CURLOPT_FOLLOWLOCATION.3).

This option affects transfers where libcurl has been told to use HTTP POST using for example [*CURLOPT\_POST(3)*](/man/os/curl/CURLOPT_POST.3) or [*CURLOPT\_MIMEPOST(3)*](/man/os/curl/CURLOPT_MIMEPOST.3) and not if the method has merely been modified with [*CURLOPT\_CUSTOMREQUEST(3)*](/man/os/curl/CURLOPT_CUSTOMREQUEST.3).

# [DEFAULT](#DEFAULT)

0

# [PROTOCOLS](#PROTOCOLS)

This functionality affects http only

# [EXAMPLE](#EXAMPLE)

```
int main(void)
{


  CURL *curl = curl_easy_init();


  if(curl) {


    CURLcode result;


    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");


    /* a silly POST example */


    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data=true");


    /* example.com is redirected, so we tell libcurl to send POST on 301,


       302 and 303 HTTP response codes */


    curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);


    result = curl_easy_perform(curl);


    curl_easy_cleanup(curl);


  }
}
```

# [HISTORY](#HISTORY)

This option was known as CURLOPT\_POST301 up to 7.19.0 as it only supported the 301 then. CURL\_REDIR\_POST\_303 was added in 7.26.0.

**CURL\_REDIR\_*** macros became *long* types in 8.16.0, prior to this version a *long* cast was necessary when passed to [*curl\_easy\_setopt(3)*](/man/os/curl/curl_easy_setopt.3).

# [AVAILABILITY](#AVAILABILITY)

Added in curl 7.19.1

# [RETURN VALUE](#RETURN_VALUE)

[*curl\_easy\_setopt(3)*](/man/os/curl/curl_easy_setopt.3) returns a CURLcode indicating success or error.

CURLE\_OK (0) means everything was OK, non-zero means an error occurred, see [*libcurl-errors(3)*](/man/os/curl/libcurl-errors.3).

# [SEE ALSO](#SEE_ALSO)

[**CURLINFO\_EFFECTIVE\_METHOD**(3)](/man/os/curl/CURLINFO_EFFECTIVE_METHOD.3), [**CURLINFO\_REDIRECT\_COUNT**(3)](/man/os/curl/CURLINFO_REDIRECT_COUNT.3), [**CURLOPT\_FOLLOWLOCATION**(3)](/man/os/curl/CURLOPT_FOLLOWLOCATION.3), [**CURLOPT\_MAXREDIRS**(3)](/man/os/curl/CURLOPT_MAXREDIRS.3), [**CURLOPT\_POSTFIELDS**(3)](/man/os/curl/CURLOPT_POSTFIELDS.3)

2026-10-19 libcurl

---

Document: CURLOPT_POSTREDIR(3) from curl 8.23.0-r1 (Chainguard OS)
Source: https://github.com/curl/curl.git
