414 Request-URI Too Large
The server read the first line of your request, the one carrying the method and the whole URL, decided it was longer than it is willing to handle, and refused before looking at anything else. Nothing is down and nothing crashed. The URL is simply too big for the buffer waiting to receive it, so sending it again unchanged gets the same answer.
Updated June 2026 · 10 min read
-
Written by
Andrian Valeanu
Founder of Pulsetic
Andrian Valeanu founded Pulsetic and, before it, Designmodo. Across 15-plus years he has shipped web products, design tools, and monitoring software teams around the world rely on.
-
Reviewed by
Ionut Caval
Technical reviewer
Ionut Caval reviews Pulsetic's technical guides for accuracy. He works hands-on with web servers, networking, and uptime monitoring day to day, and makes sure the causes and fixes here hold up in production.
The short version: Shorten the URL. A 414 means the request line (method, URL, and query string) blew past a fixed server buffer, so trimming everything after the ? and navigating from the website's home page usually gets you through. If the long URL is yours, the durable fix is to move those parameters into a POST body rather than raise the limit.
Key takeaways
- A
414is about the request line, not the request body. The method, the URL, the query string, and the HTTP version all travel on one line, and that line outgrew the buffer the server reserved for it. An upload that is too big is a 413, a different error entirely. - One code, four spellings. RFC 9110 calls it
414 URI Too Long; the older RFC 2616 called it414 Request-URI Too Long, which is still the reason phrase Apache httpd sends. nginx sends414 Request-URI Too Large. They all mean the same thing. - The defaults are lower than people expect: nginx caps the request line at one
large_client_header_buffersbuffer,8kout of the box; Apache allows8190bytes viaLimitRequestLine; IIS request filtering allows4096bytes of URL and2048bytes of query string. - The right fix is almost never a bigger buffer. If a URL is long enough to break a server, the parameters belong in a
POSTbody, because every hop in front of your origin (CDN, load balancer, WAF, framework) enforces its own ceiling and you would have to raise all of them. - Some stacks answer
400instead of414for the same oversized URL: ASP.NET does it viamaxUrlLength, and Windowshttp.sysdoes it before IIS ever runs. If you are chasing a long-URL failure that reports as a 400, see 400 Bad Request.
- Error type
- HTTP 4xx client error
- Whose side
- Usually the request; sometimes a limit set too low
- Fix difficulty
- Easy for a visitor, moderate for an owner
- Common cause
- The request line outgrew the server's buffer
How did you find out this time?
Pulsetic is website uptime monitoring. It checks your URL from outside your network as often as every 30 seconds, confirms any failure from another region, then emails you.
10 monitors free, email alerts on failure and recovery. No credit card.
What does 414 Request-URI Too Large mean?
A 414 means the server refused the request because the target URI is longer than it is willing to interpret. The important word is line. In HTTP/1.1 the first thing a client sends is a single request line holding the method, the full target URL with its query string, and the protocol version, for example GET /search?q=... HTTP/1.1. Servers read that line into a fixed buffer allocated in advance, and when the line does not fit, they stop there and answer 414. Nothing about the request body matters, which is why a 414 never has anything to do with an upload: an oversized body is a 413, a completely separate error.
The name has changed and the servers disagree about it. RFC 2616 called the code 414 Request-URI Too Long. RFC 9110, the current HTTP specification, renamed it 414 URI Too Long in Section 15.5.15. Apache httpd still sends the old reason phrase, nginx sends Request-URI Too Large, and MDN documents the new name. Software only ever looks at the number, so treat all four spellings as the same error.
RFC 9110 is unusually specific about how you get here, and its list matches what happens in practice. It names three situations: a client that improperly converted a POST request into a GET with long query information, a client that has descended into an infinite loop of redirection (the spec's own example is a redirected URI prefix that points to a suffix of itself), and a server under attack from a client probing for security holes. The redirect case looks a little different in modern applications, where each hop nests the previous full URL inside a return parameter rather than pointing at itself, but the result is the same runaway URL. Add the two current favorites, a session or SAML message stuffed into the query string and a filter interface that serializes every option into parameters, and that covers nearly every real case.
One quirk worth knowing before you start debugging: not every server answers 414 for an over-long URL. IIS request filtering returns a 404 with substatus 404.14, ASP.NET returns 400 Bad Request when maxUrlLength is exceeded, and Windows http.sys returns a 400 in the kernel before IIS runs at all. So a long-URL failure can turn up as a 400 or a 404 in your logs, and the 400 Bad Request guide covers that overlap from the other side.
- 414
- HTTP status code, in the 4xx client error class
- 8k
- nginx buffer the whole request line must fit inside
- 8190
- Bytes Apache allows on the request line by default
- 4096
- Bytes of URL IIS request filtering allows by default
How the 414 Request-URI Too Large error appears
The wording changes depending on your browser, device, or server. Here is how this error commonly shows up:
414
Request-URI Too Large
The URL you requested is longer than this server will accept.
414 Request-URI Too LargeThe nginx reason phrase, and the wording most people end up searching for414 URI Too LongThe current name in RFC 9110, used by MDN and most modern HTTP clients414 Request-URI Too LongThe RFC 2616 name, still the reason phrase Apache httpd sendsRequest-URI Too LongShort form printed on Apache's default error pageHTTP Error 414Generic browser, proxy, or framework rendering of the status414 errorThe shorthand people use in tickets and log summariesnginx 414What you search for when the error page carries an nginx footer404.14 URL Too LongNot a 414 at all: IIS request filtering rejects an over-long URL as a 404 substatus
414 vs 400, 413 and 431
These four all mean "something you sent was too big or unreadable", but each points at a different part of the request, and the fixes have nothing in common.
| Code | What is too big | Typical fix |
|---|---|---|
| 414 URI Too Long | The request line: method, URL, query string, and protocol version, all on one line. | Shorten the URL, or move the parameters into a POST body. Raise the server limit only as a last resort. |
| 400 Bad Request | Nothing specific. The server could not parse the request at all. Several stacks answer 400 instead of 414 for an over-long request line. | Fix the malformed part, and check whether a URL or header limit is the real cause hiding behind a generic 400. |
| 413 Content Too Large | The request body: a file upload or a large POST payload. RFC 2616 called this one Request Entity Too Large. | Raise the body size limit, or upload in chunks. Nothing to do with the URL. |
| 431 Request Header Fields Too Large | The headers, usually a pile of cookies or a fat authorization token, rather than the URL. | Trim the cookies at the source, then raise the per-field header limit if they are genuinely large. |
| 404.14 / 404.15 (IIS only) | The URL or the query string, measured by IIS request filtering against maxUrl and maxQueryString. | Shorten the URL, or raise maxUrl and maxQueryString in the request filtering section. |
Where the URL length limit lives, layer by layer
A 414 is one of these ceilings being hit. Find the layer that answered before you change any number, because raising the wrong one does nothing.
| Layer | Setting | Default | What happens when you exceed it |
|---|---|---|---|
| nginx | large_client_header_buffers | 4 8k | The request line has to fit inside one buffer, so the size (the second number) is the real ceiling, not the count. Over it, nginx returns 414 Request-URI Too Large. A single oversized header field returns 400 instead. |
| nginx | client_header_buffer_size | 1k | Only the first, small buffer. A longer request line simply moves into a large buffer, so raising this one on its own does not lift the 414 ceiling. |
| Apache httpd | LimitRequestLine | 8190 | Bytes allowed on the whole request line, method and HTTP/1.1 included, so a GET leaves 13 bytes fewer for the URL itself. Over it, Apache returns 414 Request-URI Too Long. |
| Apache httpd | LimitRequestFieldSize | 8190 | Bytes per header field, not the URL. Exceeding this gives a 400, which is a large part of why the two errors get confused. |
| IIS request filtering | maxUrl | 4096 | Bytes of URL. IIS does not send a 414: it answers 404 with substatus 404.14 (URL Too Long). |
| IIS request filtering | maxQueryString | 2048 | Bytes of query string, counted separately from the rest of the URL. Substatus 404.15 (Query String Too Long). |
Windows http.sys | MaxFieldLength / MaxRequestBytes | 16384 / 16384 | Two kernel-level caps applied before IIS sees the request: one per header field, which Microsoft notes works out to roughly 32k characters for a URL, and one on the request line and headers combined. Over either you get a 400 and a FieldLength or RequestLength entry in httperr.log. |
| ASP.NET | maxUrlLength / maxQueryStringLength | 260 / 2048 | Characters, configured under httpRuntime. ASP.NET returns 400 Bad Request, not a 414, and the 260 default catches people out constantly. |
| Cloudflare | URL length | 16 KB | Documented edge limit (request headers cap at 128 KB in total). The request is turned away before your origin sees it, so raising an nginx or Apache limit changes nothing. |
What actually makes a query string run away
Almost every real 414 traces back to one of these patterns. The third column is the fix that survives the next CDN or framework you put in front.
| Pattern | Why it grows | What to do instead |
|---|---|---|
A list of ids: ?ids=1,2,3,... | One entry per selected row, so a "select all" on a decent-sized table clears 8 KB in a few hundred records. | POST the list as a JSON body, or persist the selection server-side and pass a short key. |
| Search, report, or faceted filters serialized into the URL | Every facet, sort, and date range gets appended, and percent-encoding turns each reserved byte into three characters. | Store the filter server-side and put an opaque id in the URL. Bonus: the link stays shareable. |
| SAML over the HTTP-Redirect binding | The SAMLRequest or SAMLResponse is deflated and base64-encoded into the query string, and it grows with the user's group membership. | Switch the binding to HTTP-POST so the message travels in a form body. |
returnUrl or redirect_uri chains | Each hop nests the previous full URL inside the next one, so the URL roughly doubles per redirect until the buffer gives out. | Keep the return path in the session, cap the chain, and fix the loop rather than the buffer. |
| Accumulated tracking parameters | Campaign tags, click ids, and session ids pile up as links are copied, re-shared, and re-tagged. | Strip unknown parameters at the edge, and canonicalize on arrival. |
| A payload smuggled through a parameter | Base64 inflates content by about a third before percent-encoding gets to it, so a small blob becomes a large URL. | Upload it with POST and reference it by id. |
What causes 414 Request-URI Too Large?
- A
GETcarrying data that belongs in aPOSTbody: a saved report definition, a long filter expression, or a list of hundreds of record ids in the query string. - A redirect loop that appends or nests a parameter on every hop, typically a
returnUrlorredirect_uriwrapping the previous full URL, so the request line roughly doubles each time round until it breaks. See Too Many Redirects for the loop itself. - A session token, auth blob, or SAML message passed in the query string. SAML over the HTTP-Redirect binding is the usual offender, because the message is base64-encoded and grows with the user's group membership.
- Percent-encoding inflation: every reserved or non-ASCII byte becomes three characters (
%XX), so a filter that looks short in the UI can be three times that size on the wire. - Tracking and campaign parameters accumulating as a link gets copied, re-tagged, and re-shared until the query string dwarfs the path.
- A broken rewrite or proxy rule that appends the same path segment or parameter on each pass, producing URLs like
/app/app/app/.... - A limit set unusually low somewhere in the chain rather than a genuinely huge URL: ASP.NET's
maxUrlLengthdefault of 260 characters, IIS'smaxQueryStringdefault of 2048 bytes, or a tight WAF rule. - Automated scanners and exploit attempts sending deliberately enormous URIs. RFC 9110 lists this as one of the reasons the status exists, and a handful of these in your logs is background noise, not an incident.
How to find the cause fast
- Measure the URL before you theorize.
printf '%s' "$URL" | wc -cgives you the byte count, which is what the server counts. Compare it against the ceilings that apply: 8 KB on default nginx,8190on default Apache,4096on default IIS request filtering. - Binary-search the length. Cut the query string in half, retry, and keep halving or doubling until you find the exact point where the status flips. The number you land on usually names the layer for you, since 2048, 4096, and 8190 each belong to a specific default.
- Work out which hop answered. Check the
Serverheader on the 414 and the look of the error page: an nginx page, an Apache page, an IIS404.14detailed error, and a CDN block page are all visually distinct, and each has a different setting behind it. - Look for a redirect loop feeding the URL. Run
curl -sILagainst the original request and watch whether eachLocationis longer than the last. Growth per hop means you have a loop, not a long URL. - Read the access log, but do not trust the length you see there. A server that refused the request line never finished reading it, and plenty of log formats and log pipelines truncate long URLs anyway, so a URL that looks reasonable in the log may have arrived far longer.
- On Windows, check
httperr.logfor aFieldLengthreason. That ishttp.sysrejecting the request in the kernel with a 400, which no IIS-level setting affects.
How 414 Request-URI Too Large looks from the outside
A 414 is almost invisible to ordinary monitoring, because the URLs people monitor are short. The home page, the health endpoint, and the login page all fit comfortably inside any buffer, so an external check reports the website up and fast while the long, parameterized URLs that carry real work quietly fail. The server is genuinely healthy from its own point of view too: it answered in milliseconds and logged a normal 4xx. That combination is what lets a 414 sit in production for weeks after someone lowered a buffer or added a WAF, noticed only when a customer with more data than everyone else complains. If long URLs matter in your product, monitor one representative long URL alongside the short ones and assert on the status code, not just on the host answering.
To confirm the exact code a URL returns, or to re-test several at once after a fix, run them through the free bulk URL status checker.
How to fix 414 Request-URI Too Large
If you are a visitor
- Delete everything from the
?onwards and load the page again. If the shortened URL works, the query string was the problem. - Go to the website's home page and navigate to what you wanted from there, instead of using the long link.
- Re-copy the link from wherever it came from. A copy-paste that picked up a duplicated fragment or a doubled query string is a common cause.
- Did it start right after signing in? Clear that website's cookies and try again. A login redirect that keeps nesting the return URL inside itself is a redirect loop, and clearing the cookies breaks the cycle.
- Try a different browser or a private window to rule out an extension that rewrites or appends to URLs.
- If you did not build the URL, there is nothing further for you to fix. Report the broken link to the website owner, and include the full URL so they can measure it.
If you run the website
- Move the parameters into a request body. Switching the endpoint from
GETtoPOST(orPUT) with a JSON or form body removes the ceiling entirely and is the only fix that survives the next CDN, gateway, or framework you put in front of the app. - Where the URL has to stay shareable, persist the payload server-side and put a short opaque key in the URL. The link stays a link, and the request line stays small.
- If a redirect loop is inflating the URL, fix the loop first. Raising the buffer only lets the loop run one or two hops longer before failing.
- Only then raise the limit, and raise it on every hop. In nginx set the size in
large_client_header_buffers; in Apache setLimitRequestLine; in IIS setmaxUrlandmaxQueryStringunder request filtering. Note that nginx'sclient_header_buffer_sizeis only the first small buffer and does not lift the ceiling on its own. - On Windows, check the layers above IIS as well: ASP.NET's
maxUrlLengthdefaults to 260 characters, andhttp.sysenforcesMaxFieldLengthin the kernel before IIS is involved. - Check the edge too. Cloudflare documents a 16 KB URL limit, and other CDNs and load balancers have their own, so an origin that now accepts the URL can still be shielded by something that does not.
- Keep any URL a human might share, bookmark, or paste under about 2,000 characters. That is well inside every default limit and inside the historical Internet Explorer ceiling that a lot of middleware was written around.
- Alert on 414 in your logs. It is rare enough that a sudden run of them is always worth a look, and it usually points at a deploy that changed a limit or a client that started sending more data.
Still not fixed? Next steps
- Test the origin directly, bypassing the CDN, with the same long URL. Cloudflare documents a 16 KB URL limit, and other edges and load balancers set their own, so the request can be refused before your origin ever gets a chance to accept it.
- On Windows, read
C:\Windows\System32\LogFiles\HTTPERR\httperr.log. AFieldLengthreason (a single field, the URL included, overMaxFieldLength) or aRequestLengthreason (request line plus headers overMaxRequestBytes) meanshttp.sysrejected the request in the kernel with a 400, before IIS ran, and no IIS or ASP.NET setting will change that. - When only some users hit it, look at what their client is appending. Anything sized by the account, a SAML message or an auth token that grows with group membership being the classic case, will break for your largest accounts and nobody else.
- Building the client? Measure the URL length before the request leaves and fail loudly above a threshold you choose, say 2 KB, instead of shipping a URL that works on your data and breaks on production data.
Code & configuration
Copy-paste starting points. Replace example.com and the paths with your own, and test changes on staging before production.
nginx: raise the request line ceiling
# The request line must fit inside ONE large buffer, so the size
# (the second number) is the ceiling, not the count.
http {
client_header_buffer_size 1k; # default: the first, small buffer
large_client_header_buffers 4 16k; # default: 4 8k
# Buffers are allocated on demand, so this allows up to 64k per
# connection that actually sends a long request line or headers.
}
# Test the config, then reload:
# nginx -t && nginx -s reload
Apache httpd: raise LimitRequestLine
# Bytes allowed on the whole request line: method + URI + HTTP version.
# Default is 8190, so a GET leaves 13 bytes fewer for the URL itself.
LimitRequestLine 16384
# Header fields have a separate limit. Exceeding this one returns 400,
# not 414, which is why the two errors get mixed up.
LimitRequestFieldSize 16384
# Both are server config / virtual host only. Neither works in .htaccess.
# Under name-based vhosts the value comes from the first-listed vhost
# matching the IP and port, so set it there.
#
# Check and reload:
# apachectl configtest && apachectl graceful
curl: reproduce a 414 and find the real ceiling
# Build a 20,000 character query string and send it
LONG=$(printf "a%.0s" $(seq 1 20000))
curl -sI "https://example.com/search?q=$LONG"
# Typical nginx response:
# HTTP/1.1 414 Request-URI Too Large
# Server: nginx
# Connection: close
# Binary-search the limit: print just the status code per length
for n in 1000 2000 4000 8000 16000; do
Q=$(printf "a%.0s" $(seq 1 $n))
printf "%6s -> " "$n"
curl -so /dev/null -w "%{http_code}\n" "https://example.com/search?q=$Q"
done
# The length where the code flips tells you which layer set the limit.
How to prevent 414 Request-URI Too Large
Keeping URLs short is a design decision, not a monitoring one: parameters that belong in a body should go in a body, and anything a person will share should stay well under a couple of thousand characters. What monitoring adds is the catch when a limit changes underneath you, since a lowered buffer or a new WAF rule breaks long URLs while the home page keeps returning 200. Pulsetic checks the URLs you choose from multiple locations as often as every 30 seconds and alerts you by email, SMS, voice call, Slack, Discord, or webhook when one starts returning 414 instead of the page, so point a check at a representative long URL as well as the short ones. It measures availability from the outside, the way a visitor experiences it, and does not read your server's buffers or config.
Learn how Pulsetic's uptime monitoring detects this from the outside, across 15+ locations.
Frequently asked questions
-
What does 414 Request-URI Too Large mean?
It means the server would not process your request because the URL was longer than it is prepared to read. HTTP sends the method, the full URL, and the protocol version on a single request line, and servers read that line into a buffer of fixed size. When the line does not fit, the server stops and returns 414. The server is healthy and the request body is irrelevant: only the length of that first line matters.
-
What is the maximum URL length?
There is no single answer, because every layer sets its own. In practice the server is what stops you: nginx caps the request line at one
large_client_header_buffersbuffer,8kby default; Apache allows8190bytes viaLimitRequestLine; IIS request filtering allows4096bytes of URL and2048of query string; Cloudflare documents a 16 KB URL limit at the edge. Modern browsers accept URLs far longer than any of those, so they are rarely the constraint. The common advice to stay under about 2,000 characters comes from Internet Explorer's old 2,083 character ceiling, and it remains a sound rule for any URL a person will share. -
How do I fix a 414 error as a visitor?
Trim the URL. Delete everything after the
?and reload, or go to the website's home page and navigate to the page from there. If it began right after you signed in, clear that website's cookies, since a login redirect that keeps nesting the return URL inside itself will grow the URL on every hop. Beyond that there is nothing on your side to change: the limit belongs to the server, so send the full URL to the website owner and let them fix it. -
Why does my server return 400 instead of 414 for a long URL?
Because not every stack uses 414 for this. ASP.NET returns
400 Bad Requestwhen a URL exceedsmaxUrlLength, Windowshttp.sysreturns a 400 in the kernel when a field passesMaxFieldLength, and IIS request filtering returns a404with substatus404.14rather than either. Some proxies also collapse any unparseable request line into a generic 400. If a long URL is failing as a 400, the 400 Bad Request guide covers the same ground from that direction. -
How do I fix a 414 in nginx?
Raise the buffer size in
large_client_header_buffers, which defaults to4 8k. The request line has to fit inside a single buffer, so it is the size that matters, not the count:large_client_header_buffers 4 16k;in thehttpblock doubles the ceiling. Raisingclient_header_buffer_sizealone does nothing for this, since that directive only sizes the first small buffer. Runnginx -tand reload afterwards, and remember the buffers are allocated per connection on demand. -
How do I fix a 414 in Apache?
Increase
LimitRequestLine, which defaults to8190bytes and covers the entire request line, so the URL itself gets slightly less than that. Set it in the server config or the virtual host, since it is not valid in.htaccess, and with name-based virtual hosts the value is taken from the first-listed host matching that IP and port. If your headers are large as well,LimitRequestFieldSizeis the separate directive for those, and exceeding it produces a 400 rather than a 414. -
Should I raise the URL limit or switch to POST?
Switch to POST in nearly every case. Raising a limit fixes one layer, and a request has to survive the CDN, the load balancer, the WAF, the web server, and the application framework, each with its own ceiling and its own default. Moving the parameters into a request body removes the ceiling everywhere at once. It also keeps long payloads out of access logs, browser history, and
Refererheaders, which is worth having on its own when those parameters carry anything sensitive. -
Can a redirect loop cause a 414?
Yes, and RFC 9110 names it as one of the classic causes. When each redirect nests the previous URL inside a parameter such as
returnUrlorredirect_uri, the URL roughly doubles per hop, so a loop that would otherwise show up as Too Many Redirects hits the request line buffer first and surfaces as a 414 instead. The giveaway is aLocationheader that grows on every hop. Fix the loop rather than the buffer. -
Why is it called 414 URI Too Long in some places and 414 Request-URI Too Large in others?
The name changed with the spec and the servers never caught up in unison. RFC 2616 named it
414 Request-URI Too Long. RFC 9110, which replaced it, shortened the name to414 URI Too Long, and that is what MDN and most modern clients use. Meanwhile Apache httpd still sends the reason phraseRequest-URI Too Long, and nginx sendsRequest-URI Too Large. Four spellings, one status code, identical meaning. Only the numeric code matters to software. -
Does the request line limit still apply on HTTP/2 and HTTP/3?
There is no request line on HTTP/2 or HTTP/3: the URL travels as the
:pathpseudo-header inside a compressed header block. The limit does not disappear, though. nginx documents that the same buffer limits are applied similarly on HTTP/2 and HTTP/3 connections: the size of one buffer caps a request header field as compressed with HPACK or QPACK, and the request header as a whole is limited after decompression. So a URL that is too long is still refused, but the status code you get back can differ from the plain 414 you would see on HTTP/1.1. -
Is a 414 response cached?
It can be. RFC 9110 marks 414 as heuristically cacheable, meaning a cache is allowed to store and reuse it even with no explicit cache headers. That is the opposite of a 429, which the spec bars from being cached. The practical consequence: after you raise a limit or shorten a URL, a CDN or proxy may keep handing out the stored 414 for a while. Purge the cache for that URL before you conclude the fix did not work.
-
My URL is nowhere near 8 KB and I still get a 414. What else could it be?
Something in the chain has a much lower limit than the web server. IIS request filtering stops at
4096bytes of URL and2048bytes of query string by default, and ASP.NET'smaxUrlLengthdefaults to just 260 characters. A WAF or API gateway can be tighter still. Work out which layer answered by checking theServerheader and the look of the error page, then read that layer's limit rather than assuming the origin's. -
Is there any case where raising the limit is the right call?
Yes, when the long URLs are legitimate, you control every hop, and switching to POST is not available: a signed callback URL from a third party you cannot change, or an internal reporting tool whose deep links genuinely need the parameters. Raise the number on each layer that touches the request, not just the origin, and remember nginx allocates those buffers per connection on demand, so
4 16kmeans up to 64 KB per connection that actually sends a long request line.
Trusted by teams at companies around the world
-
Catch the next outage before your visitors do.
2-minute setup · Cancel any time
-
No credit card needed