如何在 Nginx 上使用 PHP 脚本覆盖“Content-Type”标头

如何在 Nginx 上使用 PHP 脚本覆盖“Content-Type”标头

我有一些 php 脚本,它返回内容类型为“image/jpeg”的 jpeg 图像(1x1 像素):

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

此脚本在带有 php5-fpm 模块的 nginx/1.2.1 上运行。问题是,所有与“位置〜\ .php $“具有 Content-Type 标头”文本/html;字符集=UTF-8“,忽略我的php函数标头('内容类型:图像/jpeg'). 结果我得到了内容类型为“text/html”的 jpeg 图片。

这是我的虚拟主机的简化配置:

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,这是一个包含 PHP 发出的标头的 nginx 变量Content-type。如果您需要对此进行一些丑陋的破解,您可以if在 nginx 配置中将其与语句一起使用。

相关内容