So überschreiben Sie den Header „Content-Type“ mit einem PHP-Skript auf Nginx

So überschreiben Sie den Header „Content-Type“ mit einem PHP-Skript auf Nginx

Ich habe ein PHP-Skript, das ein JPEG-Bild (1 x 1 Pixel) mit dem Inhaltstyp „image/jpeg“ zurückgibt:

// 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);

Dieses Skript läuft auf nginx/1.2.1 mit dem Modul php5-fpm. Das Problem ist, dass alle Antworten von Anfragen, die mit "Standort ~ \.php$" habe Content-Type-Header "text/html; Zeichensatz=UTF-8", ignoriert meine PHP-FunktionHeader('Inhaltstyp: image/jpeg'). Als Ergebnis erhalte ich ein JPEG-Bild mit dem Inhaltstyp „Text/HTML“.

Hier ist eine vereinfachte Konfiguration meines virtuellen Hosts:

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;
    }
}

Antwort1

Sind Sie sicher, dass es nginx und nicht PHP ist, das das hinzufügt Content-type: text/html? Aus Ihrer eingefügten Konfiguration sieht es nicht so aus. Es könnte sein, dass Sie anderen PHP-Code haben, der es zuerst einstellt. Versuchen Sie, Ihren PHP-Header-Aufruf so zu ändern, dass er wie folgt aussieht:

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

Das zweite Argument überschreibt alle anderen vorherigen Aufrufe für diesen bestimmten Header.

Vielleicht möchten Sie sich auch ansehen $upstream_http_content_type, eine Nginx-Variable, die den Content-typevon PHP ausgegebenen Header enthält. Wenn Sie einen hässlichen Hack dafür benötigen, können Sie ihn mit einer ifAnweisung in Ihrer Nginx-Konfiguration verwenden.

verwandte Informationen