Назад | Перейти на главную страницу

Как переопределить заголовок Content-Type с помощью PHP-скрипта на Nginx

У меня есть скрипт 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; charset = UTF-8", игнорируя мою функцию php заголовок ('Content-Type: image / 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;
    }
}

Вы уверены, что это nginx, а не PHP, который добавляет Content-type: text/html? Это не похоже на вашу вставленную конфигурацию. Возможно, у вас есть другой PHP-код, который устанавливает его первым. Попробуйте изменить вызов заголовка PHP, чтобы он выглядел так:

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

Второй аргумент отменяет любые другие предыдущие вызовы для этого конкретного заголовка.

Вы также можете посмотреть на $upstream_http_content_type, который является переменной nginx, содержащей Content-type заголовок, созданный PHP. Если вам нужен уродливый хакер, вы можете использовать его с if в вашей конфигурации nginx.