You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP HTTP代理设置Content-Type头后图片无法正常显示的问题排查

PHP HTTP代理设置Content-Type头后图片无法正常显示的问题排查

我在尝试用PHP搭建HTTP代理时,碰到了设置Content-Type响应头的奇怪问题——这段代码直接导致代理无法正常工作:

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer(fread($sc, 512));
header("Content-Type: {$mimeType}");

于是我开始调试,把代码改成了输出MIME类型的版本:

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer(fread($sc, 512));
echo $mimeType;

结果输出是image/jpg,而我通过代理访问的目标链接确实是JPG图片,这说明MIME类型的检测是完全正确的。但当我改回设置header("Content-Type: {$mimeType}")而不是输出类型时,代理又失效了。

查看响应头,Content-Type确实被设置成了image/jpg,但返回的图片却显示为损坏状态(就是常见的图片加载失败的占位样式)。

以下是完整的代理代码:

$context = stream_context_create([
    "http" => [
        "method" => "GET",
        "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36\r\n"
    ]
]);

$content = fopen($url, 'rb', false, $context);

if ($content) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);

    // 注释掉下面两行代码的话,代理就能恢复正常工作
    $mimeType = $finfo->buffer(fread($content, 512));
    header("Content-Type: {$mimeType}");


    fpassthru($content);
    fclose($content);
} else {
    http_response_code(500);
    echo "Failed to retrieve the requested resource.";
}

我没有选择用get_headers($url, 1)来获取目标资源的Content-Type,是因为有些网站不会正确返回这个头信息。

备注:内容来源于stack exchange,提问作者もぐもぐぷりん

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 02:54:36