300 Multiple Choices
3xx redirection
The resource has several representations and the client should pick one.
300 is the rarely used 'there are options' redirect. The server lists alternatives — different formats or languages — and may suggest a preferred one in the Location header. Content negotiation through Accept headers replaced it in practice, so mainstream servers almost never send it.
| Class | 3xx Redirection |
|---|---|
| Retry? | Not applicable |
| Cacheable by default | Yes (heuristically, per RFC 9110) |
| Response body | Allowed |
| Defined in | RFC 9110 §15.4.1 — 300 Multiple Choices |
Example response
HTTP/1.1 300 Multiple Choices Location: /docs/en
When you'll see it
- Servers with agent-driven content negotiation enabled.
- Hand-built APIs that list alternative representations.
How to use it well
- Prefer server-driven negotiation (
Accept,Accept-Language) and a direct 200. - If you do use 300, include a
Locationfor the preferred choice so browsers can follow it automatically.
Send a 300 from your server
Express
res.redirect(300, "/docs/en");
Next.js route handler
return NextResponse.redirect(new URL("/docs/en", request.url), 300);Flask
return redirect("/docs/en", code=300)Go net/http
http.Redirect(w, r, "/docs/en", http.StatusMultipleChoices)
nginx
return 300 /docs/en;
Check what a URL returns
Print just the status line from the command line, or check a whole list of URLs at once, with their response headers, in the HTTP Status Checker.
curl -sI https://example.com/your-path | head -n 1
Frequently asked questions
Do browsers follow a 300 automatically?
Only when a Location header is present. Otherwise they show the response body, which should list the choices as links.
Headers used with 300
Related status codes