![如何在 Nginx 上使用 PHP 脚本覆盖“Content-Type”标头](https://linux22.com/image/658319/%E5%A6%82%E4%BD%95%E5%9C%A8%20Nginx%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20PHP%20%E8%84%9A%E6%9C%AC%E8%A6%86%E7%9B%96%E2%80%9CContent-Type%E2%80%9D%E6%A0%87%E5%A4%B4.png)
我有一些 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 配置中将其与语句一起使用。