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つずつチェックしてみてください。
コメントを残す