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

PHP

PHPWEBシステムを構築する際の便利な技を公開しています。

-


オススメサイト

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

 

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になるので、この辺りも関係しているのかもしれません。何か法則が分かったらまた追記します。

-
-