
Eu tenho um script php que retorna imagem jpeg (1x1 pixel) com 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 rodando em nginx/1.2.1 com módulo php5-fpm. O problema é que todas as respostas de solicitações que correspondem a "localização ~\.php$"tem cabeçalho Content-Type"texto/html; conjunto de caracteres=UTF-8", ignorando minha função phpheader('Tipo de conteúdo: imagem/jpeg'). Como resultado, recebo uma imagem JPEG com 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;
}
}
Responder1
Tem certeza de que é o nginx, e não o PHP, que está adicionando o Content-type: text/html
? Não parece assim pela sua configuração colada. Pode ser que você tenha outro código PHP que o esteja configurando primeiro. Tente alterar sua chamada de cabeçalho 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 dar uma olhada em $upstream_http_content_type
, que é uma variável nginx que contém o Content-type
cabeçalho que o PHP emitiu. Se você precisar de um truque feio para resolver isso, poderá usá-lo com uma if
instrução na configuração do nginx.