Видео и субтитры · Загрузчик медиафайлов по прямой ссылке
Почему CORS может блокировать прямую загрузку в браузере и что это значит
· Как это работает
корс http загрузки
Загрузчик только для браузера живет в рамках политики одного и того же источника. В этом посте объясняется, что такое CORS, почему некоторые хосты разрешают выборку, а другие нет, и почему инструмент без сервера ретрансляции не может обойти это.
Ссылка работает в новой вкладке, но не работает в инструменте — загадка, которую создает для пользователей ошибка CORS.
Приложение подкаста может воспроизводиться при вводе в адресную строку, но не воспроизводиться, когда страница пытается прочитать его с помощью Fetch. Навигация и чтение по сценарию — это разные возможности браузера. Первый отображает ресурс; второй может предоставить свои байты коду, работающему в другом источнике.
Direct Media Downloader нуждается во второй мощности, поскольку он считывает фрагменты ответов, сообщает о ходе выполнения, создает большой двоичный объект и предлагает именованное сохранение. Если медиа-хост не включил это чтение из разных источников, браузер не позволяет JavaScript получать ответ, хотя обычная навигация все еще может работать. То же различие объясняет, почему копирование адреса в другое приложение может привести к другому результату, даже если ни одно из приложений не изменило удаленный файл.
Политика одного и того же происхождения в одном абзаце — почему страница на toolacre.com не может свободно читать байты, подаваемые из другого источника
Источник объединяет схему, имя хоста и порт. Поэтому страница, обслуживаемая ToolAcre, и файл, обслуживаемый издателем CDN, обычно имеют разное происхождение. Политика одного и того же источника не позволяет сценарию одного источника свободно читать ответы другого источника, защищая данные, предоставляемые через доступ к внешнему браузеру.
Это ограничение накладывается браузером, а не предупреждением, придуманным в загрузчике. Он применяется до того, как код приложения сможет проверять защищенные заголовки или фрагменты тела. Исходный хост все еще может получать запрос, поэтому заблокированное чтение никогда не должно описываться как «ни с чем не связывались». Границы происхождения применяются к читаемым ответам, а не только к расширениям файлов, поэтому очевидный суффикс `.mp3` не дает никаких особых исключений для скриптов страниц.
Что делает Access-Control-Allow-Origin — как хост файла, а не инструмент, решает, может ли браузер передавать байты
Удаленный сервер может согласиться, вернув соответствующий заголовок `Access-Control-Allow-Origin`. Это решение зависит от конфигурации файлового хоста. ToolAcre не может добавить заголовок к чужому ответу, а опция запроса не может предоставить разрешение, удержанное принимающим сервером.
Разрешительный заголовок позволяет браузеру отображать ответ на странице; он не подтверждает авторские права, безопасность или качество мультимедиа. Аналогично, отсутствие заголовка не доказывает, что URL сломан. Это всего лишь означает, что этому сценарию перекрестного происхождения не хватает разрешения на чтение того, что вернул сервер. Администраторам хоста следует проверить точное происхождение запроса и методы, которые они собираются поддерживать, а не добавлять вслепую разрешающие заголовки во все пространство имен хранилища.
Заблокированное чтение из перекрестного источника и почему скрипт не получает сохраняемого ответа
Загрузчик использует обычный режим выборки CORS вместо `no-cors`. При отказе в чтении из перекрестного источника Fetch отклоняет, и код приложения не получает ни пригодных для использования заголовков, ни тела. Инструмент сообщает объединенную категорию `CORS_OR_NETWORK`, поскольку браузеры намеренно не раскрывают достаточно подробностей, чтобы отличить CORS от каждого сбоя транспорта.
Непрозрачные ответы относятся к явным запросам `no-cors`, но этот режим не решит эту задачу: JavaScript не может проверить непрозрачное тело и превратить его в нужный Blob. Таким образом, реализация честно терпит неудачу вместо того, чтобы получить нечитаемый ответ и сделать вид, что она может его сохранить. Поскольку приложение никогда не получает эти скрытые байты, оно не может достоверно рассчитать ход выполнения, вывести имя файла из защищенных заголовков или создать из них полезный объект URL.
Рабочий пример: чтение неудачного запроса на панели сети — обнаружение отсутствующего заголовка и подтверждение того, что ни один сервер ретрансляции не был подключен.
Откройте панель «Сеть», сохраните журнал и один раз нажмите «Проверить ссылку». Попытка выполнить строку HEAD определяет место назначения и может отображать диагноз CORS браузера. Проверьте заголовки ответов, если они доступны; Отсутствие разрешающего заголовка объясняет, почему код страницы не получил объявленный размер или тип MIME.
Неудачная проверка уже является свидетельством того, что была предпринята настоящая попытка запроса. Нет строки ToolAcre API, содержащей вставленный URL, и нет второго запроса на ретрансляцию. Если хост плохо разрешает HEAD, Download все равно может вести себя по-другому, поскольку он использует GET, но ни один из путей не переключает архитектуру автоматически. Формулировка консоли различается в зависимости от браузера, поэтому сохраните неудавшуюся строку и заголовок вместо того, чтобы зависеть от формулировки одного поставщика для эксплуатационного отчета.
Почему инструмент не обходит его — использование прокси будет означать отправку вашей ссылки на сервер, а это именно то, чего инструмент обещает не делать.
Прокси-сервер может получить файл на стороне сервера и вернуть его из конечной точки того же источника, избегая чтения браузером из разных источников. Это также раскрыло бы ссылку и каждый переданный байт этому оператору, увеличило бы пропускную способность и создало бы поверхность произвольной выборки. ToolAcre намеренно не имеет такой конечной точки.
Альтернативным вариантом, предлагаемым интерфейсом, является встроенная в браузере ссылка «Сохранить как действие», если она доступна. Это навигация или обработка загрузки, а не чтение скриптов страниц. Это предложение не ослабляет политику хоста, не аутентифицирует посетителя и не превращает защищенный поток в прямой файл. Этот архитектурный отказ также не позволяет ToolAcre накапливать копии, журналы доступа или права на исходящую выборку исключительно для того, чтобы превратить отказ браузера в очевидный успех.
На что это не распространяется: CORS — это не то же самое, что 403, стена входа или подписанный URL с истекшим сроком действия.
Сбой CORS не является HTTP 403, хотя любой из них может остановить рабочий процесс. 403 — это статус ответа, выбранный хостом; подпись с истекшим сроком действия может стать причиной этого. Стена входа требует учетные данные, которые этот инструмент не учитывает. Сбой в сети, сбой DNS и проблемы с сертификатами могут привести к общему отказу браузера при получении.
Поэтому при диагностике следует использовать панели «Сеть» и «Консоль» вместе, а не рассматривать каждую ошибку как отсутствующий заголовок. ToolAcre сообщает об известных состояниях HTTP при поступлении читаемого ответа, но отказывается угадывать, когда браузер предоставляет только исключение в форме транспорта. Разделение этих категорий позволит правильно решить проблему: настроить CORS для авторизованного общедоступного объекта, обновить ссылку с истекшим сроком действия, войти в систему через поставщика или исправить подключение.
Вывод: CORS — это решение на стороне хоста — как Direct Media Downloader честно сообщает об этом, а не молча возвращается к серверу.
CORS управляется на медиа-хосте. Загрузчик, предназначенный только для браузера, может подчиниться этому выбору, объяснить его и остановиться; он не может переопределить выбор из клиентского кода. Эта граница неудобна именно потому, что она не позволяет произвольным страницам стать универсальными межсайтовыми читателями.
Используйте управление загрузкой, предоставляемое хостом, запросите авторизованный файл с поддержкой CORS или используйте собственную ссылку для сохранения, если это необходимо. Direct Media Downloader сдерживает свое обещание, выявляя отказ и сохраняя прямой путь от браузера к хосту, а не пряча сервер за более удачной кнопкой. Таким образом, успешный результат должен исходить от совместного хоста или другого легального браузера, а не от подавления текста ошибки при сохранении того же отказа в чтении.