CakePHPで開発を進める中、「Content-Length ヘッダーがレスポンスに表示されない」という問題に直面することがあります。通常、このヘッダーは自動で付与されることが多いですが、特定の環境や設定によって表示されなくなるケースも存在します。
本記事では、Content-Length が通常付与されるケースと、付与されない主な原因について整理し、確認すべき設定とコマンドを紹介します。
通常 Content-Length が付与される主な原因
1. PHPからの明示的な出力
PHP が echo や print で固定長の出力を返すと、自動的に Content-Length が追加されることがあります。
2. 出力バッファリング(Output Buffering)
php.ini で output_buffering が有効 (On) になっている場合、PHPは出力全体の長さを事前に計算し、Content-Length を付与します。
3. Apacheのデフォルト動作
Apacheは、静的ファイルや一部の動的出力に対して、自動的に Content-Length を付けることがあります。
4. mod_deflate / mod_gzip 使用時
圧縮が有効な場合、代わりに Transfer-Encoding: chunked が使用され、Content-Length が省略されることがあります。
Content-Length が表示されない原因とそのチェック方法
CakePHPなどのアプリケーション開発時に Content-Length が出力されない場合、以下のいずれかが原因である可能性があります。
1. Apache設定で Header unset Content-Length を記述している
000-default.conf や .htaccess に次のような記述があると、Apacheがこのヘッダーを消すようになります。
Header unset Content-Length
2. Transfer-Encoding: chunked が優先されている
Apacheがチャンク転送(分割レスポンス)を使用していると、Content-Length は明示されません。
確認コマンド:
curl -i http://cakephp.test/
ヘッダーに Transfer-Encoding: chunked が含まれているか確認します。
3. PHPコードで header_remove() が使われている
たとえば AppController に以下のような記述があると、PHP側で Content-Length を削除しています。
header_remove('Content-Length');
4. 出力バッファリングが無効
php.ini で output_buffering = Off に設定されていると、出力の長さが測れず、Content-Length が付与されない場合があります。
確認コマンド:
php -i | grep output_buffering
5. Apacheモジュールが無効
mod_deflate や mod_php など、必要なApacheモジュールが無効になっていると、圧縮や出力処理が正しく行われません。
確認コマンド:
apachectl -M
状況確認に使えるコマンド一覧
| コマンド | 説明 |
|---|---|
curl -i http://cakephp.test/ | レスポンスヘッダーを確認 |
| `apachectl -M | grep headers` |
| `php -i | grep output_buffering` |
表形式でのまとめ
| 表示されない理由候補 | チェック方法・補足 |
|---|---|
Header unset Content-Length 記述あり | Apache設定を確認 |
Transfer-Encoding: chunked が使用されている | curl -i で確認 |
PHPで header_remove() が使われている | コントローラやミドルウェアを確認 |
output_buffering = Off | php.ini の設定を確認 |
| Apacheモジュールが無効 | apachectl -M で確認 |
もし問題の原因を特定したい場合は…
お使いのApache設定ファイル(例: /etc/apache2/sites-enabled/000-default.conf)や、CakePHPのコントローラー設定をご共有いただければ、さらに詳しく調査・解説が可能です。
開発環境によっては、複数の要因が重なって Content-Length が出力されなくなっていることもあります。1つずつチェックしてみてください。
コメントを残す