🎇
【Laravel】SESSION_DRIVER=cookieはApacheと使ってはいけない
概要
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などセッション情報がクッキーに含まれない形式のものにする
今回のケースでは後者を採用しました。
参考
このChadが書いた記事がなかったら詰んでいました。
Discussion