Как обслуживать часть файла с Nginx? - PullRequest
3 голосов
/ 12 апреля 2020

Я использую X-Accel для обслуживания защищенного контента, используя X-Accel-Redirect.

Можно ли обслуживать только часть файла? например, диапазон байтов 0-x или первые 5 минут видео (моя конечная цель)

Это важно сделать на стороне сервера, чтобы клиент не имел доступа к остальным файл.

В настоящее время я отправляю весь файл так:

X-Accel-Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: application/octet-stream
Content-Length: {file_size}
Content-Disposition: attachment; filename="myfile.mp4"
Accept-Ranges: bytes
X-Accel-Buffering: yes
X-Accel-Redirect: /protected/myfile.mp4

Nginx conf:

location /protected {
    internal;
    alias /dir/of/protected/files/;
    if_modified_since off;
    output_buffers 2 1m;
    open_file_cache max=50000 inactive=10m;
    open_file_cache_valid 15m;
    open_file_cache_min_uses 1;
    open_file_cache_errors off;
}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Массовым хаком было бы использование nginx для прокси к себе с заголовком Range, который ограничил бы запрос диапазоном байтов

примерно так (не проверено, так что это, вероятно, не будет работать , но идея должна работать):

{ 

    ... snip config ...

    server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /html;
                index index.html;

        location / {

            proxy_pass http://localhost/content;
            add_header Range btyes=0,100000;
        }

        location /content {
           try_files $uri $uri/ =404;
        }
    }
}
0 голосов
/ 21 апреля 2020

Я не тестировал Slice и X-Accel вместе. Если у каждого файла может быть свой лимит, определенный бэкэндом, вы можете настроить Slice в местоположении и отправить лимит с URL-адресом X-Accel-Redirect, как показано ниже:

X-Accel-Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: application/octet-stream
Content-Length: {file_size}
Content-Disposition: attachment; filename="myfile.mp4"
Accept-Ranges: bytes
X-Accel-Buffering: yes
X-Accel-Redirect: /protected/myfile.mp4?s=0&e=$PHP_VAR

Nginx .conf

location /protected {
    slice; # enable slicing
    slice_start_arg s;
    slice_end_arg e;

    internal;
    alias /dir/of/protected/files/;
    if_modified_since off;
    output_buffers 2 1m;
    open_file_cache max=50000 inactive=10m;
    open_file_cache_valid 15m;
    open_file_cache_min_uses 1;
    open_file_cache_errors off;
}

Глобальный лимит файлов

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

Nginx conf:

location /sample {
    slice; # enable slicing
    slice_start_arg s;
    slice_end_arg e;

    internal;
    alias /dir/of/protected/files/;
    if_modified_since off;
    output_buffers 2 1m;
    open_file_cache max=50000 inactive=10m;
    open_file_cache_valid 15m;
    open_file_cache_min_uses 1;
    open_file_cache_errors off;
}

location /protected {
    rewrite ^ /sample&s=0&e=1024; # replace for the desired file limit in bytes
}

Если указанная выше директива rewrite не работает, я предлагаю следующую опцию, используя proxy_pass.

location /protected {
    set $file_limit 1024 # replace for the desired file limit in bytes
    set $delimiter "";
    if ($is_args) {
        set $delimiter "&";
    }
    set $args $args${delimiter}s=0&e=$file_limit;
    proxy_pass $scheme://127.0.0.1/sample; 
}
...