Как передавать ссылку на загрузку файла?

Немного поточнее:
Имеется Яндекс.Диск, в котором по папкам раскиданы файлы. Есть сервис, который умеет через Яндекс.Диск api получать ссылку для загрузки файла. Вот по этой ссылке пользователь должен скачать файл.
Как отдаются файлы на данный момент:

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: filename="'.$fileName.'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    readfile($link);
    exit;

Проблема: у некоторых файлов длинное имя кириллицей и ссылка для загрузки получается очень длинной (может быть > 700 символов) и по какой то причине readfile() с такой ссылкой мне отдает файл 0 байт. Это я выяснил методом тыка. С ссылками ~400-500 символов все нормально.
Что я пробовал делать:
1)возвращать пользователю Header('Location: ссылка') и window.location.replace("ссылка");. В обоих случаях мне возвращалась ошибка 404. Но если в строке браузера выделить ссылку и снова перейти по ней, то файл загружается, но пользователям так не удобно...
2) readfile(urldecode($link)) - не помогло.
Пример ссылки (временная). По ней readfile не загрузит файл.
https://downloader.disk.yandex.ru/disk/52c3337c365d9044817e92ed2703cc8a4a496f796d8980b3275b3bc7017deb16/5f808e47/EwE7dCJGCpeSA5HvX_gAhD92c7nRGPL5t8Rdyf2UQ0nox42CuKvGq1KO4wRbIyWN8OQP1FUGENiZzW2EdGrI2Q%3D%3D?uid=1096029541&filename=%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B0_%E2%84%9612345678_%D0%BD%D0%B0_%D0%BB%D0%BE%D1%82_%E2%84%961234567_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D1%8B_%E2%84%961233456_%D0%B4%D0%BE%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B7%D0%B0%D1%8F%D0%B2%D0%BA%D0%B8.zip&disposition=attachment&hash=&limit=0&content_type=application%2Fzip&owner_uid=1096029541&fsize=255&hid=d009b8d7098c222298f285ec79dcafa9&media_type=compressed&tknv=v2&etag=8cea810e7ab846f2545e72ad5c92a11e
Пример рабочей (короткой) ссылки:
https://downloader.disk.yandex.ru/disk/6588a657572f436808dbb49624bcc8dff19a49d2f291cdd0a0af3d576231a2da/5f808f03/fKqInKw3d7bLFOeFnMGnhCeKJj9YyFgvY444Pl-jL4npo-h8eLjZ0R98ilOUCa9RoU-mwY58ezrNZrtNJeerOrCJ5Wf9lyUTsKmOUxllosGr8npumZHI4midPdWhecNq?uid=1096029541&filename=sc.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=1096029541&fsize=66&hid=6654bced876356c2aef0f3728330cf74&media_type=document&tknv=v2&etag=23410687fffe0403b4e49000ce0babaa

UPD файл с кодом:

<?php
$yadToken = 'secret';
function curl($url, $data, $headers, $method = 'POST', $retryCount = 7, $lastResponse = NULL) {
    if ($retryCount > 1) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        //check first num in http code
        if(substr($httpcode, 0, 1) == 2)
            return $response;
         else
            usleep(125000);
            return curl($url, $data, $headers, $method, --$retryCount, $response);
    } else {
        return $lastResponse;
    }
}
// пример пути: /dir1/dir2/my_file.txt
function getLinkToDownloadFile($path) {
    $url = 'https://cloud-api.yandex.net/v1/disk/resources/download?path='.$path;
    $headers = array(
        'Accept: application/json',
        'Authorization: OAuth '.$GLOBALS['yadToken']
    );
    $resp = curl($url, array(), $headers, 'GET');
    return json_decode($resp, true)['href'];
}
if(isset($_GET['path']))
{
    $path = $_GET['path'];
    $link = getLinkToDownloadFile($path);
    $slashIndex = strripos($path, '/');
    $fileName = substr($path, slashIndex + 1);
   
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: filename="'.$fileName.'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    readfile($link);
    exit;
} else {
    echo '<script type="text/javascript">document.location = "/"</script>';
}
?>

UPD:
Если в echo file_get_contents() поместить эту длинную ссылку, то ничего не выводит, в других случаях текст/мусор.


Ответы (0 шт):