0%

414 error URL is too large

Context

專案遇到一個狀況 :form 是使用 GET 作操作,所以會遇到 url 過長的問題。

Browser URL Limit

其實 browser 可以到 64K 以上,所以如果不是 browser 問題可以看 response 414 的 source 是誰。 如果是 Nginx ,就往下找 Nginx 問題。

Ngnix Problem

Limit File Upload with Nginx

Problem encountered: 414 url is too long error If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client.

Default value: 1 MB

Solution:

Set the client_max_body_size in /etc/nginx/nginx.conf to the proper size.

1
2
3
Syntax: client_max_body_size size;
Default: client_max_body_size 1MB;
Context: http, server, location

This directive can be set in the http, server or location context.

Reference

ref-1ref-2ref-3ref-4

Context

調整 client_max_body_size 後可以 accept 的 url 長度有比較多,但是仍沒有顯著改善, 但回傳的已為 400

找 Nginx log
1
2
3
ssh staging server
cd /var/log/nginx
cat error.log

Ref

發現是 Puma 問題
1
[error] 2320#0: *1 connect() to unix:/srv/app/shared/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream, client: 172.31.5.28, server: , request: "GET /health_check HTTP/1.1", upstream: "http://unix:/srv/app/shared/tmp/sockets/puma.sock:/health_check", host: "172.31.25.150"

找 Puma error log

1
2
3
4
ssh staging server
cd /srv/app/current
cd log
cat puma_error.log
1
HTTP parse error, malformed request (127.0.0.1/amp/api/v1/properties/count): #<Puma::HttpParserError: HTTP element QUERY_STRING is longer than the (1024 * 10) allowed length (was 10706)

可以發現已經超過 Puma 可以處理的長度。

結論

這邊有關於超過 Puma QUERY_STRING 最大 size 的相關 issue。偉哉我公司同事後來發了一個 PR 來擴充 Puma QUERY_STRING 的長度,這個問題有解喇。