我正在尝试在 php 中创建 HTTP 代理,但在设置
Content-Type
标头时出现错误。
这段代码破坏了我的整个代码:
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer(fread($sc, 512));
header("Content-Type: {$mimeType}");
所以我开始调试,我这样更改了代码:
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer(fread($sc, 512));
echo $mimeType;
它说
image/jpg
,我尝试通过代理访问的链接也是jpg。
所以它检测正确,但后来我从回显它重新更改为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);
// removing 2 lines below will make it work again
$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
的原因是,有些网站无法正确返回。
您使用 fread 读取最多 512 个字节,但从未将这些字节发送到客户端。您正在修剪响应的开头。
在调用 fpassthru 之前回显字节:
$finfo = new finfo(FILEINFO_MIME_TYPE);
$head = fread($content, 512);
// TODO: check that there are sufficient bytes to determine the mime type.
$mimeType = $finfo->buffer($head);
header("Content-Type: {$mimeType}");
echo $head;
fpassthru($content);