Назад | Перейти на главную страницу

X-Accel-Redirect возобновляет прерванную загрузку

Я использую Nginx X-Accel-Redirect для обслуживания большого защищенного файла (несколько ГБ) для пользователей. Серверное приложение обрабатывает URL-адрес и проверяет токен загрузки (встроенный в URL-адрес) и запускает или отклоняет загрузку. Проблема в том, что загрузка не может быть возобновлена, если загрузка не удалась по какой-либо причине. Файл действительно большой, поэтому вероятность этого нельзя игнорировать.

Для получения дополнительной информации сервер находится на AWS EC2, а файл находится в корзине S3. Это означает, что мы платим и за неудачную загрузку.

Я хочу знать, можно ли защитить файл с помощью токенов загрузки или других средств, чтобы пользователи не могли просто делиться ссылками для загрузки с другими, но при этом их можно было возобновить в случае отключения сети.


Сервер python пересылает в Nginx следующие заголовки.

content_type='application/force-download'
Content-Disposition='attachment; filename=xxx'
X-Accel-Redirect=<url>

Конфигурация Nginx выглядит следующим образом.

location ~ ^/protected/(.*) {
    internal;
    resolver 8.8.8.8;
    resolver_timeout 60;
    proxy_hide_header Content-Type; # To hide header from S3
    proxy_hide_header x-amz-id-2;
    proxy_hide_header x-amz-request-id;
    proxy_set_header Content-Type 'application/force-download';
    proxy_max_temp_file_size 0;
    proxy_pass https://***.amazonaws.com/***/$1;
}

Похоже, вы отправляете запросы на S3, а не обслуживаете предварительно подписанные URL с нормальный перенаправление (например, 303), а не X-Accel-Redirect, что обычно делается для создания устаревших ссылок.

В вашем случае я ожидаю, что заголовок запроса Range удаляется. Убедитесь, что вы передаете заголовки запроса из браузера в S3 с помощью proxy_pass_request_headers on; в location. Кроме того, вам, вероятно, не стоит internal определены для этого location.