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,提问作者もぐもぐぷりん
相关产品推荐
相关产品推荐

