「ディスパッチベース」のロゴ画像

CGI版のPHPでheader関数が効かない場合

CGI版のPHPはheader関数が効かず文字化けする場合がある

昨今、PHPはバージョンが煩雑すぎるので、大抵の場合、共用サーバーはCGI版のPHPで動作するようになっています。

しかし、CGI版のPHPだと、PHP内からヘッダ情報を送信してもApache側でヘッダが上書きされてしまうという弊害もあります。

PHPソースコードの例

<?php

	header('Content-type: text/html; charset=utf-8');
	echo 'あいうえお';
	exit;

?>

CGI版PHPの結果例

Content-Type: text/html

縺ゅ>縺�∴縺�      ←文字化けする

WebサーバーがApacheの場合の解決方法

当サイトで紹介している .htaccessで簡単文字化け対策 のように、AddDefaultCharsetでも文字化けは解消できますが、

他にもhttpのヘッダ情報を操作したいこともあり得るので、ここでは.htaccessで特定のファイルだけヘッダ情報を書き換える方法を紹介します。

.htaccess

# test.php だけにヘッダ情報をセットする例
<Files test.php>

	Header set Content-Type 'text/html; charset=utf-8'

</Files>

.htaccessを設置したあとのCGI版PHP実行結果例

Content-Type: text/html; charset=utf-8

あいうえお       ←文字化けせずに表示される

補足

2019年12月14日追記
共用サーバーの .htaccessで「AddType application/x-httpd-php .html」を設定している場合は逆に、.htaccessの Header set Content-Typeは効かず、PHP内のheader関数が効くという不思議な現象に遭遇しました。 使用した共用サーバーのPHPバージョンが拡張子phpだと7.3で、拡張子htmlだと5.3になるので、この辺りも関係しているのかもしれません。何か法則が分かったらまた追記します。

▲ページ先頭に戻る

PHP

PHPでWEBシステムを運用する際の便利な技を公開しています。

-
記事更新日:2019年12月14日
記事公開日: