我正在尝试在 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 之前回显字节: