web-dev-qa-db-ja.com

「コンテンツタイプ」ヘッダーをPHP Nginxのスクリプトでオーバーライドする方法

コンテンツタイプが「image/jpeg」のjpeg画像(1x1ピクセル)を返すphpスクリプトがあります。

// return image
$image_name = 'img/pixel.jpg';
$image = fopen($image_name, 'rb');
header('Content-Length: ' . filesize($image_name));
header('Content-Type: image/jpeg');
fpassthru($image);

このスクリプトは、php5-fpmモジュールを使用してnginx/1.2.1で実行されます。問題は、 "location〜\.php $"に一致するリクエストからのすべての応答にContent-Typeヘッダーがあります "text/html; charset = UTF-8"、私のことを無視することですphp関数header( 'Content-Type:image/jpeg')。その結果、「text/html」コンテンツタイプのjpeg画像が表示されます。

これが私の仮想ホストの簡単な設定です:

server {
    listen                  80;
    server_name             localhost default_server;

    set                     $main_Host      "localhost";
    root                    /var/www/$main_Host/www;

    location / {
        root  /var/www/$main_Host/www/frontend/web;
        try_files  $uri /frontend/web/index.php?$args;

        location ~* ^/(.+\.(css|js|jpg|jpeg|png|gif|bmp|ico|mov|swf|pdf|Zip|rar))$ {
            try_files  $uri /frontend/web/$1?$args;
        }
    }

    location /admin {
        alias  /var/www/$main_Host/www/backend/web;
        try_files  $uri /backend/web/index.php?$args;

        location ~* ^/admin/(.+\.php)$ {
            try_files  $uri /backend/web/$1?$args;
        }

        location ~* ^/admin/(.+\.(css|js|jpg|jpeg|png|gif|bmp|ico|mov|swf|pdf|Zip|rar))$ {
            try_files  $uri /backend/web/$1?$args;
        }
    }

    location ~ \.php$ {
        try_files  $uri /frontend/web$uri =404;

        include             fastcgi_params;

        fastcgi_pass        unix:/var/run/php5-fpm.www.sock;
        fastcgi_param       SCRIPT_FILENAME     $document_root$fastcgi_script_name;
    }
}

Content-type: text/htmlを追加しているPHPではなく、それがnginxであることを確信していますか?貼り付けた設定からはそうは見えません。それを最初に設定している他のPHPコードがある可能性があります。 PHPヘッダー呼び出しを次のように変更してみてください。

header('Content-Type: image/jpeg', true);

2番目の引数は、その特定のヘッダーに対する他の以前の呼び出しをオーバーライドします。

PHPが発行した$upstream_http_content_typeヘッダーを含むnginx変数であるContent-typeを確認することもできます。これを回避するために醜いハックが必要な場合は、nginx構成のifステートメントで使用できます。

1
Andy Fowler