创建 HTTP 代理并使用 finfo 检测 mimeType,它破坏了整个代码(php)

问题描述 投票:0回答:1

我正在尝试在 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
的原因是,有些网站无法正确返回。

php proxy
1个回答
0
投票

您使用 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);
© www.soinside.com 2019 - 2024. All rights reserved.