
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-type
encabezado que emitió PHP. Si necesita un truco feo para solucionar esto, puede usarlo con una if
declaración en su configuración de nginx.