Nginx 處理超長(zhǎng) Cookie 導(dǎo)致的 400 錯(cuò)誤
當(dāng)用戶(hù) Cookie 過(guò)長(zhǎng)(例如含大量跟蹤參數(shù)、登錄態(tài)或前端埋點(diǎn)數(shù)據(jù)),Nginx 默認(rèn)的 client_header_buffer_size(通常為 1k 或 4k)可能不足以容納完整的請(qǐng)求頭,導(dǎo)致直接返回 400 Bad Request,且日志中常出現(xiàn) client sent too large header 或 too long URI 類(lèi)似提示——這不是應(yīng)用層問(wèn)題,而是 Nginx 在解析 HTTP 請(qǐng)求頭階段就拒絕了連接。
問(wèn)題現(xiàn)象
400 Bad Request Request Header Or Cookie Too Large
這是 Nginx 默認(rèn)安全限制觸發(fā)的錯(cuò)誤,當(dāng) HTTP 請(qǐng)求頭(特別是 Cookie)超過(guò)配置閾值時(shí)返回。
根本原因
Nginx 有幾個(gè)關(guān)鍵配置參數(shù)控制請(qǐng)求頭大?。?/p>
| 參數(shù) | 默認(rèn)值 | 作用 |
|---|---|---|
| large_client_header_buffers | 4 8k | 大請(qǐng)求頭緩沖區(qū)大小和數(shù)量 |
| client_header_buffer_size | 1k | 初始請(qǐng)求頭緩沖區(qū)大小 |
| client_max_body_size | 1m | 請(qǐng)求體最大大小 |
觸發(fā)條件:
- 單個(gè) Cookie 過(guò)大(如存儲(chǔ) JWT、大量用戶(hù)數(shù)據(jù))
- Cookie 數(shù)量過(guò)多(如第三方統(tǒng)計(jì)腳本堆積)
- 請(qǐng)求頭總大小超過(guò)緩沖區(qū)限制
解決方案
方案一:調(diào)整 Nginx 緩沖區(qū)配置(推薦)
http {
# 增大初始緩沖區(qū)到 4KB
client_header_buffer_size 4k;
# 設(shè)置大請(qǐng)求頭緩沖區(qū):4個(gè)8KB緩沖區(qū)(最大32KB)
large_client_header_buffers 4 8k;
# 或者更大(根據(jù)實(shí)際需求)
# large_client_header_buffers 8 16k; # 最大128KB
include /etc/nginx/conf.d/*.conf;
}針對(duì)特定站點(diǎn)(Server 塊配置):
server {
listen 80;
server_name example.com;
# 為該站點(diǎn)單獨(dú)設(shè)置更大的限制
client_header_buffer_size 8k;
large_client_header_buffers 4 16k;
location / {
proxy_pass http://backend;
}
}方案二:清理/優(yōu)化 Cookie(治本)
如果 Cookie 過(guò)大是因?yàn)闃I(yè)務(wù)邏輯問(wèn)題,建議從源頭解決:
// 前端:避免存儲(chǔ)過(guò)多數(shù)據(jù)到 Cookie // ? 錯(cuò)誤做法:將大量數(shù)據(jù)存 Cookie document.cookie = "userData=" + JSON.stringify(hugeObject); // ? 正確做法:Cookie 只存會(huì)話ID,數(shù)據(jù)存 localStorage/后端 document.cookie = "sessionId=" + sessionId; // 僅少量關(guān)鍵數(shù)據(jù)
常見(jiàn) Cookie 瘦身場(chǎng)景:
- JWT Token 過(guò)長(zhǎng) → 使用 Refresh Token 機(jī)制
- 存儲(chǔ)用戶(hù)權(quán)限列表 → 改為存用戶(hù)ID,權(quán)限放后端緩存
- 第三方腳本(GA、百度統(tǒng)計(jì)等)Cookie 堆積 → 定期清理
方案三:刪除特定過(guò)大的 Cookie
如果無(wú)法立即修改代碼,可用 Nginx 攔截處理:
server {
listen 80;
server_name example.com;
# 刪除特定的超大 Cookie(正則匹配)
if ($http_cookie ~* "oversized_cookie=[^;]+") {
set $new_cookie $http_cookie;
# 復(fù)雜處理需要 Lua 模塊或外部腳本
}
# 或使用第三方模塊 ngx_http_rewrite_module 清理
more_clear_headers Cookie; # 需要 headers-more-nginx-module
}方案四:使用 Lua 模塊精確處理(OpenResty)
server {
listen 80;
access_by_lua_block {
local cookie = ngx.var.http_cookie
if cookie and #cookie > 8192 then -- Cookie 超過(guò) 8KB
-- 只保留必要的會(huì)話 Cookie
local new_cookie = ngx.re.match(cookie, "session=[^;]+")
if new_cookie then
ngx.req.set_header("Cookie", new_cookie[0])
end
end
}
proxy_pass http://backend;
}參數(shù)詳解與計(jì)算
large_client_header_buffers 4 8k; # 含義: # - 4:緩沖區(qū)數(shù)量(最多同時(shí)處理4個(gè)大請(qǐng)求頭) # - 8k:每個(gè)緩沖區(qū)大小 # - 總?cè)萘?= 4 × 8k = 32KB(單個(gè)請(qǐng)求頭最大)
如何選擇數(shù)值?:
| 場(chǎng)景 | 推薦配置 |
|---|---|
| 普通網(wǎng)站 | 4 8k(默認(rèn)或略增) |
| 有 JWT 認(rèn)證 | 4 16k 或 8 8k |
| 企業(yè)級(jí)應(yīng)用/大量權(quán)限數(shù)據(jù) | 8 32k |
| 極端情況(臨時(shí)方案) | 8 64k(不建議長(zhǎng)期使用) |
驗(yàn)證與調(diào)試
1. 查看當(dāng)前請(qǐng)求頭大小
# 查看 Nginx 錯(cuò)誤日志確認(rèn)問(wèn)題 tail -f /var/log/nginx/error.log # 典型錯(cuò)誤信息: # client sent too long header line: "Cookie: ..."
2. 測(cè)試 Cookie 大小
# 發(fā)送大 Cookie 測(cè)試
curl -H "Cookie: $(python3 -c 'print("x="+"A"*10000)')" \
http://your-site.com3. 檢查當(dāng)前配置
nginx -T | grep -E "(client_header|large_client)"
安全注意事項(xiàng)
?? 不要無(wú)限制增大緩沖區(qū):
# ? 危險(xiǎn)配置:容易遭受緩沖區(qū)溢出攻擊 large_client_header_buffers 100 1m; # 100MB 總緩沖!
建議原則:
- 先嘗試清理 Cookie(治本)
- 調(diào)整配置時(shí)遵循最小必要原則
- 配合
limit_req防止 DoS 攻擊
# 同時(shí)配置請(qǐng)求限制
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
limit_req zone=req_limit burst=20 nodelay;
large_client_header_buffers 4 16k;
}
}根據(jù)您的具體場(chǎng)景,建議優(yōu)先嘗試方案一快速恢復(fù)服務(wù),同時(shí)規(guī)劃方案二從根本上優(yōu)化 Cookie 設(shè)計(jì)。
到此這篇關(guān)于Nginx 處理超長(zhǎng) Cookie 導(dǎo)致的 400 錯(cuò)誤的文章就介紹到這了,更多相關(guān)Nginx 處理超長(zhǎng)Cookie 400 錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 利用nginx解決cookie跨域訪問(wèn)的方法
- 關(guān)于nginx日志增加cookie信息
- Nginx設(shè)置HttpOnly Secure SameSite參數(shù)解決Cookie信息丟失
- nginx cookie有效期討論小結(jié)
- Nginx轉(zhuǎn)發(fā)丟失cookie表現(xiàn)形式及解決方案
- nginx使用sticky基于cookie的會(huì)話保持方式
- nginx配置客戶(hù)端保存cookie的實(shí)現(xiàn)
- nginx?sticky實(shí)現(xiàn)基于cookie負(fù)載均衡示例詳解
- NGINX基于cookie針對(duì)同一域名進(jìn)行分流轉(zhuǎn)發(fā)
相關(guān)文章
Nginx做NodeJS應(yīng)用負(fù)載均衡配置實(shí)例
這篇文章主要介紹了Nginx做NodeJS應(yīng)用負(fù)載均衡配置實(shí)例,本文直接給出配置實(shí)例,需要的朋友可以參考下2015-01-01
nginx如何實(shí)現(xiàn)配置靜態(tài)資源服務(wù)器及防盜鏈
這篇文章主要為大家介紹了nginx實(shí)現(xiàn)配置靜態(tài)資源服務(wù)器及防盜鏈步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Nginx泛解析到子目錄后自動(dòng)判斷有無(wú)public目錄詳解
這篇文章主要給大家介紹了關(guān)于Nginx泛解析到子目錄后自動(dòng)判斷有無(wú)public目錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
nginx文件上傳限制以及超時(shí)無(wú)響應(yīng)問(wèn)題的解決
小編最近開(kāi)發(fā)前后端分離項(xiàng)目遇到一些問(wèn)題,后端服務(wù)是基于80/443端口反向代理的,所以請(qǐng)求會(huì)經(jīng)過(guò)nginx網(wǎng)關(guān),然后將請(qǐng)求代理到后端服務(wù),這是開(kāi)發(fā)環(huán)境,所以本文小編給大家介紹了解決nginx文件上傳限制和超時(shí)無(wú)響應(yīng),需要的朋友可以參考下2025-04-04
Linux環(huán)境下nginx搭建簡(jiǎn)易圖片服務(wù)器
這篇文章主要介紹了Linux環(huán)境下nginx搭建簡(jiǎn)易圖片服務(wù)器,需要的朋友可以參考下2014-10-10
Nginx配置檢測(cè)服務(wù)狀態(tài)的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx配置檢測(cè)服務(wù)狀態(tài)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
關(guān)于Nginx服務(wù)器可視化配置問(wèn)題
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行,這篇文章主要介紹了Nginx服務(wù)器可視化配置,需要的朋友可以參考下2022-10-10

