📖

Rails(puma) で URL が長すぎると 400 Bad Request が発生する

2022/09/06に公開

はじめに

Rails というより puma の話になるのですが、URLが長すぎると下記のようなエラーを吐いて「400 BadRequest」を返します。

HTTP parse error, malformed request ("GET /posts" - (-)): #<Puma::HttpParserError: HTTP element QUERY_STRING is longer than the (1024 * 10) allowed length (was 10318)>

一例ですが、検索条件としてクエリパラメーターがとても多くなった時などに発生することが多いでしょうか。

対応策と AWS の ALB を使っている場合の注意点について紹介したいと思います。

※ puma のGitHubリポジトリに書かれていることを参考にしています。
https://github.com/puma/puma/blob/master/docs/compile_options.md

puma が受け取れるURLの長さの上限

  • クエリストリング => 10240文字(1024 * 10)
  • パス => 8192文字
  • URI => 12288文字(1024 * 12)

URLの長さの上限を上げる方法

開発では bundler を使ってインストールすることが大半だと思いますので、その場合の方法です。

bundle install の前に bundle config でオプションを設定することで上限を上げることができます。

# 下記はクエリストリングの上限を上げる場合の例です。
# パスの場合は PUMA_REQUEST_PATH_MAX_LENGTH ,
# URIの場合は PUMA_REQUEST_URI_MAX_LENGTH としてください。
bundle config build.puma "--with-cflags='-D PUMA_QUERY_STRING_MAX_LENGTH=64000'"

※ ちなみに、puma.rb の設定を変えてサクっと上げるということはできません。puma のインストール時に上限が決まっているようです。

AWS の ALB を使っている場合の注意

puma の上限を上げてもロードバランサーとして ALB を使っている場合、ALBにも上限があるので、前段の ALB で弾かれることがあります。

下記のドキュメントを読むと ALB のリクエスト行の上限が16Kなので16000文字になります。
そしてこれは変更不可のようです。

となると puma 側の上限を10万文字に増やしたとしてもALB側の上限を上げることができず弾かれてしまうので注意してください。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-limits.html

Discussion

ログインするとコメントできます