🎇

【Laravel】SESSION_DRIVER=cookieはApacheと使ってはいけない

2024/07/18に公開

概要

Apacheはphp-fpmと同時に使われるmod_proxy_fcgiのヘッダー許容サイズを増やすコンフィグが機能していないので、セッションに応じてサイズの大きくなるSESSION_DRIVER=cookieだと8192バイト超過エラーが発生する。

使用FW、ツール

Laravel11 + Sail,Sanctum,Fortify
ApacheとPHPのバージョン

Server version: Apache/2.4.59 (Amazon Linux)

PHP 8.2.15 (cli) (built: Jan 16 2024 12:19:32) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.15, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.15, Copyright (c), by Zend Technologies

生じた問題

  • フォーム内の備考欄について、200文字以上入力した状態でPOSTするとブラウザのHTTP ERRORが表示された。Chromeだと目がxxみたいになってるアレ
  • 備考欄入力なしだと問題なく送信された。
  • 本番環境のみの問題で、開発環境(Laravel Sail)では起こらないバグだった。

httpdのエラーログ

まずいところは加工済み

[Fri Jan 1 00:51:29.589698 2024] [proxy_fcgi:error] [pid 1550:tid 1589] [client 172.xx.xx.xx:8586] Premature end of script headers: index.php, referer: https://hogehoge.co.jp
[Fri Jan 1 00:51:29.589937 2024] [proxy_fcgi:error] [pid 1550:tid 1589] [client 172.xx.xx.xx:8586] AH01070: Error parsing script headers, referer: https://hogehoge.co.jp
[Fri Jan 1 00:51:29.590035 2024] [proxy_fcgi:error] [pid 1550:tid 1589] (22)Invalid argument: [client 172.xx.xx.xx:8586] AH01075: Error dispatching request to : , referer: https://hogehoge.co.jp

proxy_fcgiがErrorを吐いていることが分かった。

原因

SESSION_DRIVER=cookieにしていた関係で、ヘッダーサイズが大きくなりすぎたため。

フォームの値をセッションで保持していたため、備考欄に文字を入れれば入れるだけヘッダーサイズが大きくなってしまっていた。

解決方法

  • nginxを使う: Laravel Sailではnginxを用いているため、このバグは起きなかった。
  • SESSION_DRIVER=database,fileなどセッション情報がクッキーに含まれない形式のものにする

今回のケースでは後者を採用しました。

参考

https://maxchadwick.xyz/blog/http-response-header-size-limit-with-mod-proxy-fcgi
このChadが書いた記事がなかったら詰んでいました。

Discussion