QA@IT

PHPで出力しているheaderを、Apacheが上書きしているようで困っています。

5653 PV

お世話になります。

■やりたいこと
CakePHP2.6.4 にてjsonを返すアクションを作成しようとしています。

    public function returnjson($id) {
        $this->autoRender = false;
        $this->autoLayout = false;
        $response = array('id' => $id);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($response);
        exit();
    }

■現状
詳細は異なりますが、上記のようなコードでjsonが返ることを期待していたのですが、
ブラウザでアクセスし、Response Headers を見ると、Content-Typeが "text/html; charset=utf-8"
となっており、期待していた"Content-Type: application/json; charset=utf-8"とは異なっていました。

■問題点
少し調べてみて、Apacheがコンテンツを勝手に判断しheaderを上書きしてしまっているのでは?と予想しているのですが、そこから手詰まりです。

AddType application/json .json

上記の設定は、mime.typesに記載されており、.jsonの拡張子に対しアクセスすればjsonのheaderが返るのですが、CakePHPのパラメータ付きアクションでjsonを返したいので、この設定は適用されません。

PHPの出すheaderを優先させたり、他の手段があるか、お知恵を拝借したいです。

■環境(VPSサーバなので、設定変更は自由にできます。)
OS CentOS release 6.6 (Final)
Apache/2.2.15 (yum インストール)
PHP 5.4.35 (yum インストール)
CakePHP2.6.4

以上でございます。よろしくおねがいいたします。

  • cakephpではなくて素のphpでも上書きされますか?phpだとあらゆる出力の前にheaderの指定をしないといけないのでheader呼び出しの前に何か出力されていないかが気になります。 -
  • http://book.cakephp.org/2.0/ja/controllers/request-response.html に、「CakeResponse::type() を使うことでアプリケーションレスポンスのContent-Typeを制御することができます。」とありますので、content-typeを指定するにはこれを使わないといけないのではないでしょうか。 -
  • filed_onion 様
    まさにその通りでした!
    $this->response->type('json');
    を記述することで。解決出来ました。問題だと思っていた箇所を勘違いしておりました。
    ご助言ありがとうございます。
    -

回答

コメントにより解決しましたので、解決済みにするために、解決方法を記載します。

http://book.cakephp.org/2.0/ja/controllers/request-response.html
に記述されているように、レスポンスのタイプを指定することで解決出来ました。
具体的には、下記のようなコードとなります。

    public function returnjson($id) {
    $this->autoRender = false;
    $response = array('id' => $id);
    $this->response->type('json');
    $this->response->body(json_encode($response));
    $this->response->send();
    exit();
    }

お恥ずかしながら、問題の箇所を勘違いしておりました。
コメントいただいた皆様、誠にありがとうございました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。