Como sobrescrever o cabeçalho "Content-Type" com o script PHP no Nginx

4

Eu tenho um script PHP que retorna imagem jpeg (1x1 pixel) com o tipo de conteúdo "image / jpeg":

// 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);

Este script é executado no módulo nginx / 1.2.1 com php5-fpm. O problema é que todas as respostas das solicitações que correspondem à " localização ~ \ .php $ " têm o cabeçalho Content-Type " text / html; charset = UTF-8 ", ignorando o meu função php header ('Content-Type: image / jpeg') . Como resultado, obtenho uma imagem jpeg com o tipo de conteúdo "text / html".

Aqui está uma configuração simplificada do meu host virtual:

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;
    }
}
    
por Максим Назарьев 15.05.2015 / 00:23

1 resposta

1

Tem certeza de que é o nginx, e não o PHP, que está adicionando o Content-type: text/html ? Não parece assim da sua configuração colada. Pode ser que você tenha outro código PHP que está definindo o primeiro. Tente mudar sua chamada de cabeçalho do PHP para ficar assim:

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

O segundo argumento substitui quaisquer outras chamadas anteriores para esse cabeçalho específico.

Você também pode querer ver alguns $upstream_http_content_type , que é uma variável nginx que contém o Content-type do cabeçalho que o PHP emitiu. Se você precisar de um hack feio em torno disso, você pode usá-lo com uma declaração if em sua configuração nginx.

    
por 07.11.2016 / 03:18