HTTP Status Code Reference
HTTP status meanings with troubleshooting hints, plus Nginx and Cloudflare codes
68 status codes
The client should continue sending the request body.
Troubleshoot: Waiting on 100-continue can time out; drop the Expect header and send the body.
The server agrees to switch protocols (e.g. WebSocket upgrade).
Troubleshoot: If the upgrade fails, check that the proxy forwards Upgrade and Connection headers.
Request received, still being processed.
Preliminary headers returned before the final response.
Troubleshoot: Not visible in DevTools is normal; check whether the CDN returned a response early.
The request succeeded.
The request succeeded and created a new resource.
Request accepted, not yet processed.
Troubleshoot: Accepted is not finished; poll the job status endpoint for the result.
Information returned from a non-authoritative copy.
Success with no response body.
Troubleshoot: Never send a body with 204; clients and proxies treat it as a protocol error.
Success; the client should reset the view.
Partial content returned (Range request).
Troubleshoot: If resumable downloads fail, check Accept-Ranges and Range handling.
Multiple statuses (WebDAV).
Troubleshoot: For WebDAV, parse the per-resource status codes in the XML body.
The resource has multiple representations.
The resource has permanently moved to a new URL.
Troubleshoot: Watch for redirect loops; browsers cache 301 long-term, so a bad one sticks.
The resource has temporarily moved.
Troubleshoot: Do not use 302 for permanent moves; switch to 301 or 308.
Retrieve another URI with GET.
Troubleshoot: After a form post, redirect with 303 to avoid resubmission on refresh.
The cached copy is still valid.
Troubleshoot: Stale content usually means ETag or Last-Modified disagree across servers.
Temporary redirect preserving the request method.
Troubleshoot: If POST turns into GET you picked the wrong code; 307 preserves the method.
Permanent redirect preserving the request method.
Troubleshoot: A permanent redirect that keeps the method; also cached long-term if wrong.
Malformed request syntax.
Troubleshoot: Check that the body parses and that Content-Type matches the actual format.
Authentication is required.
Troubleshoot: Check that credentials are sent and match the WWW-Authenticate scheme.
Payment required (reserved).
Authenticated but access is denied.
Troubleshoot: Separate genuine permission errors from WAF or Nginx deny rules, which also return 403.
The requested resource was not found.
Troubleshoot: Static 404s point to build output paths; API 404s to the route prefix.
The HTTP method is not allowed.
Troubleshoot: Read the Allow header; static servers often answer 405 to PUT or DELETE.
Cannot satisfy the Accept header.
Troubleshoot: Check Accept and Accept-Language against what the server can produce.
Proxy authentication is required.
Troubleshoot: Proxy auth failure: check Proxy-Authorization and the proxy configuration.
The client request timed out.
Troubleshoot: Large uploads timing out: raise client_body_timeout and keepalive_timeout.
The request conflicts with the resource state.
Troubleshoot: Concurrent write conflict; retry with optimistic locking or an idempotency key.
The resource has been permanently removed.
Troubleshoot: Only return 410 for genuinely retired URLs, then clean links and sitemaps.
Missing Content-Length header.
Troubleshoot: Add Content-Length, but never hand-write it when using chunked encoding.
A precondition header check failed.
Troubleshoot: Compare If-Match and If-Unmodified-Since with the current ETag.
The request body is too large.
Troubleshoot: Raise client_max_body_size and the gateway request body limit.
The request URI is too long.
Troubleshoot: Shorten the query string or use POST; runaway length usually means redirects appending params.
Unsupported media type.
Troubleshoot: Send the right Content-Type; a mismatched charset triggers this too.
The requested range is not satisfiable.
Troubleshoot: Check whether the Range exceeds the actual resource length.
The Expect header requirement failed.
Troubleshoot: The server ignores Expect; drop the header and retry.
Easter egg: I'm a teapot.
The request was sent to a server that cannot respond.
Troubleshoot: Check for SNI and HTTP version mismatches and the CDN origin host.
Syntactically valid but semantically wrong (e.g. form validation).
Troubleshoot: A validation failure; read the field-level errors in the response body.
The request is too early (replay risk).
Troubleshoot: TLS 1.3 early-data replay protection; just retry later.
A protocol upgrade is required (e.g. TLS).
Troubleshoot: When HTTPS or a protocol upgrade is enforced, check Upgrade and TLS config.
A precondition header is required.
Troubleshoot: The client must send a precondition header such as If-Match.
Too many requests (rate limited).
Troubleshoot: Read Retry-After and review rate limits such as limit_req or gateway QPS.
Request header fields are too large.
Troubleshoot: Trim cookies and custom headers, or raise large_client_header_buffers.
Unavailable for legal reasons.
Troubleshoot: Blocked by legal or regional policy; review compliance and geo rules.
Nginx extension: request header too large.
Troubleshoot: Raise large_client_header_buffers, or trim cookies and custom headers.
Nginx extension: client certificate failed verification.
Troubleshoot: Check ssl_verify_client and whether the client certificate chain is complete.
Nginx extension: client certificate required but not sent.
Troubleshoot: For mutual TLS, confirm the client is configured to send its certificate.
Nginx extension: HTTP request sent to an HTTPS port.
Troubleshoot: Use https instead, or add error_page 497 to redirect to https.
Nginx extension: the client closed the connection before the response.
Troubleshoot: Usually the backend was too slow; check upstream latency and timeout settings.
Internal server error.
Troubleshoot: Read the application log first, then the upstream section of the error log.
The requested functionality is not implemented.
Troubleshoot: Check whether the feature is implemented or the method is exposed.
The gateway received an invalid upstream response.
Troubleshoot: Check upstream liveness, port mapping, and connection pool saturation.
Service temporarily unavailable (overloaded or maintenance).
Troubleshoot: Check backend health, rate limiting and circuit breaker state, and maintenance mode.
The gateway timed out waiting for upstream.
Troubleshoot: Check proxy_read_timeout and slow queries on the backend.
The HTTP version is not supported.
Troubleshoot: Check the client HTTP version and protocol negotiation settings.
Insufficient storage (WebDAV).
Troubleshoot: Storage or quota exhausted; free space or expand the quota.
An infinite loop was detected (WebDAV).
Troubleshoot: A WebDAV loop; look for symlinks and rewrite rules.
Network authentication required (e.g. captive portal).
Troubleshoot: A captive portal login is required; verify the portal page loads.
Cloudflare extension: origin returned an empty or unknown response.
Troubleshoot: Compare origin access and fetch logs to see whether the origin returned nothing.
Cloudflare extension: the origin web server is down.
Troubleshoot: Verify the origin process and listening port, then check for a restart.
Cloudflare extension: connection to origin timed out.
Troubleshoot: Whitelist CDN egress IPs on the origin firewall and check network reachability.
Cloudflare extension: the origin is unreachable.
Troubleshoot: Check the origin address and DNS record, and whether the origin only listens internally.
Cloudflare extension: origin response timed out (100 s default).
Troubleshoot: Make long tasks asynchronous or cache them, and check origin-side slow queries.
Cloudflare extension: SSL handshake with the origin failed.
Troubleshoot: Check the origin certificate, TLS versions, and cipher suites supported by the CDN.
Cloudflare extension: the origin certificate is invalid.
Troubleshoot: Check the certificate chain and hostname match, or relax the SSL mode.
Cloudflare extension: Railgun listener error; the feature is retired.
Troubleshoot: Railgun has been retired; this is a legacy code and can be ignored.
Something broken or missing?
Send feedback