Cómo anular el encabezado "Tipo de contenido" con un script PHP en Nginx

Cómo anular el encabezado "Tipo de contenido" con un script PHP en Nginx

Tengo un script php que devuelve una imagen jpeg (1x1 píxel) con el tipo de contenido "imagen/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 se ejecuta en nginx/1.2.1 con el módulo php5-fpm. El problema es que todas las respuestas de solicitudes que coinciden "ubicación ~ \.php$"tiene encabezado de tipo de contenido"texto/html; juego de caracteres = UTF-8", ignorando mi función phpencabezado('Tipo de contenido: imagen/jpeg'). Como resultado, obtengo una imagen jpeg con el tipo de contenido "texto/html".

Aquí hay una configuración simplificada de mi 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;
    }
}

Respuesta1

¿Estás seguro de que es nginx y no PHP el que agrega el Content-type: text/html? No parece así según la configuración pegada. Podría ser que tengas otro código PHP que lo esté configurando primero. Intente cambiar su llamada de encabezado PHP para que se vea así:

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

El segundo argumento anula cualquier otra llamada anterior para ese encabezado específico.

Es posible que también quieras mirar un poco $upstream_http_content_type, que es una variable nginx que contiene el Content-typeencabezado que emitió PHP. Si necesita un truco feo para solucionar esto, puede usarlo con una ifdeclaración en su configuración de nginx.

información relacionada