414 URI Too Long
用法
收到 414 URI Too Long 错误消息时,客户端明白服务器期望一个更短的 HTTP 路径或地址。虽然规范并未对长度作出任何要求,但在实践中,浏览器会限制其大小以防止某些类型的攻击。
服务器、反向代理和框架各自会施加其自身的 URI 长度限制。常见的默认值介于 4 KB 到 8 KB 之间,尽管没有规范定义上限。
414 URI Too Long 响应默认可缓存。
SEO 影响
像 Google 这样的搜索引擎不会索引响应状态为 414 的 URL。此前已被索引的 URL 会从搜索结果中移除。
示例
客户端使用一个超出服务器所允许长度的 URI 请求资源。
请求
GET /<...a_long_URI...> HTTP/1.1
Host: example.com
响应
HTTP/1.1 414 URI Too Long
如何修复
最常见的原因是 GET 请求带有过多的查询参数,或在 URL 中编码了过长的值。重定向循环或每次循环都追加参数的配置错误重写规则也会触发此错误。
客户端侧修复:
nginx:增大 large_client_header_buffers 以允许更长的请求行。该指令取两个值:缓冲区数量和缓冲区大小,例如 large_client_header_buffers 4 32k。重启 nginx 以生效。
Apache:在 httpd.conf 中将 LimitRequestLine 设为更高的字节值。默认为 8190 字节。对于 URL 较长的应用,高至 128000 的值也很常见。更改后重启 Apache。
IIS:在 web.config 文件中 system.webServer > security > requestFiltering > requestLimits 下编辑 maxUrl 和 maxQueryString。默认值为 URL 长度 4096 字节、查询字符串 2048 字节。尽量将这些值保持在可行的低位。过大的 URL 限制会增加遭受注入攻击的风险。
当该错误出现在浏览器而非 API 中时,清除浏览器缓存和 Cookie 有时能解决问题,尤其是在陈旧的 Cookie 使请求头大小膨胀超出服务器限制时。
代码参考
.NET
HttpStatusCode.RequestUriTooLong
Rust
http::StatusCode::URI_TOO_LONG
Rails
:uri_too_long
:request_uri_too_long
Go
http.StatusRequestURITooLong
Symfony
Response::HTTP_REQUEST_URI_TOO_LONG
Python3.5+
http.HTTPStatus.REQUEST_URI_TOO_LONG
Java
java.net.HttpURLConnection.HTTP_REQ_TOO_LONG
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_URI_TOO_LONG
Angular
@angular/common/http/HttpStatusCode.UriTooLong