
У меня есть PHP-скрипт, который возвращает изображение JPEG (1x1 пиксель) с типом содержимого "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);
Этот скрипт работает на nginx/1.2.1 с модулем php5-fpm. Проблема в том, что все ответы на запросы, соответствующие "местоположение ~ \.php$"имеют заголовок Content-Type"текст/html; кодировка=UTF-8", игнорируя мою функцию phpheader('Тип содержимого: изображение/jpeg'). В результате я получаю jpeg-картинку с типом содержимого "text/html".
Вот упрощенная конфигурация моего виртуального хоста:
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;
}
}
решение1
Вы уверены, что это nginx, а не PHP добавляет Content-type: text/html
? Из вставленной вами конфигурации это не так. Возможно, у вас есть другой код PHP, который устанавливает его первым. Попробуйте изменить вызов заголовка PHP так:
header('Content-Type: image/jpeg', true);
Второй аргумент переопределяет любые другие предыдущие вызовы для этого конкретного заголовка.
Вы также можете захотеть взглянуть на $upstream_http_content_type
, которая является переменной nginx, содержащей Content-type
заголовок, который выдал PHP. Если вам нужен уродливый хак вокруг этого, вы можете использовать его с if
оператором в вашей конфигурации nginx.