DISQUS

Homo-Adminus Blog: Using X-Accel-Redirect Header With Nginx to Implement Controlled Downloads (with rails and php examples)

  • Aleks · 3 years ago
    cool article ;-)

    I have add it to the wiki site http://wiki.codemongers.com/NginxXSendfile
  • Amigo · 3 years ago
    Класс!
  • Rapsey · 2 years ago
    Will it work if you want to use the flv module with start=XXX parameter?
  • Scoundrel · 2 years ago
    2Rapsey: Why not?
  • Rapsey · 2 years ago
    because it would be to awesome.
  • nir0 · 2 years ago
    привет!
    я реализовал контролируемые скачивания, но есть одна проблема - nginx со всеми файлами передает заголовок text/html, и браузер его соответственно открывает. не подскажете, с чем это может быть связано, и как испраить?
  • Denis · 2 years ago
    $r->send_http_header posulaet eto,
    4to-bu zapretit - powli pustoj $r->send_http_header();
  • nir0 · 2 years ago
    да я затупил, короче... там ошибка была, типа, нет такого темплейта. она и заменяла заголовок на text/html, а тело документа менялось на содержимое файла.
  • bianbian · 2 years ago
    good article.
    I have thanslated it into Simplified-Chinese:
    http://bianbian.sunshow.net/index.php/technolog...
    enjoy~
  • Ruby · 2 years ago
    Неужели и не решили проблеммы с сменой заголовка ??
  • peroksid · 2 years ago
    Здорово. Часто под контролируемым скачиванием понимают еще и отметку, когда скачивание файла было закончено. Тут nginx помочь может?
  • Scoundrel · 2 years ago
    2pereksid: Можно и такое. Называлось вроде post_action - нгинкс умеет дергать нужный урл когда юзер все докачает.
  • Andrey Popov · 2 years ago
    Можно по подробнее, из-за чего nginx выдает на .exe файлы, text/html вместо application/octet-stream?
  • nir0 · 2 years ago
    > Можно по подробнее, из-за чего nginx выдает на .exe файлы, text/html вместо application/octet-stream?
    Это может быть потому, что процесс выдает ошибку "500 No template for action download"
    так как ошибка выводится в html, то она подменяет заголовок на text/html.
    проверьте логи ruby
  • jackaXs · 2 years ago
    DOES NGINX IPV6 CAPABLE ???????!!!!!!!!!!!!!??????????????????!!!!!!!!!!!!!???????????????????!!!!!!!!!!!!!!!!!!!!
  • znikus · 2 years ago
    нет, это статья не все. если использовать пхп как модуль апача, то сервер ляжет под нагрузкой, когда обратятся несколько юзверов при помощи флашгета с 10 потоками. Лучшим вариантом будет запуск проверяющего скрипта на фастCGI.
  • si-rus · 2 years ago
    Как вы смотрите на то, чтобы для уменьшения нагрузки дописать к nginx модуль или фильтр какой нить для реализации антилича.
  • Scoundrel · 2 years ago
    2si-rus: он реализуется родными средствами (if + regexp) в конфиге.
  • square · 2 years ago
    Ошибочка маленькая в rewrite, должно быть так, видимо:
    rewrite ^/download/(.*)$ /down.php?path=$1 last;

    2 Andrey Popov:
    Попробуй перед редиректом (X-Accel-Redirect) отдавать заголовок руками т.е.:
    Content-type: application/octet-stream
  • Alex Egg · 2 years ago
    What about the rest of the code for the rails controller.

    This confuses me because you have to render something....?

    I have nginx setup and I am setting the header, but then what? render :text => ""???
  • WIll · 1 year ago
    For explorer 6 users downloading pdfs you also need to set the cache-control header, or you get a 'document not found' error message from the acrobat reader. It seems this is because the explorer regards the file as temporary and deletes it before acrobat can see it.

    anyway, i use this to make pdf downloads work:


    location /download_control/ {
    root ...;
    default_type application/pdf;
    expires 1h;
    add_header Cache-Control private;
    internal;
    }


    Otherwise, I've been very happy with nginx and this download control mechanism (and I've written a radiant plugin to make use of it, which should appear soon). thank you.
  • erik · 1 year ago
    a sto tut delat???
  • Blythe · 1 year ago
    This works great for me. I modified the x_send_file rails plugin to work with nginx.
    http://spongetech.wordpress.com/2007/11/13/the-...
  • jsmirnoff · 1 year ago
    При таком подходе в заголовке Content-Type всегда оказывается text/html. Соответственно, бинарный файл загружается браузером в окно а не предлагается для скачивания.

    Как оказалось, это заголовок по умолчанию, который выдает сам PHP скрипт, и nginx его уже не трогает.

    Выход довольно прост, надо запретить PHP выдавать этот заголовок, например, так:

    ini_set('default_mimetype', '');

    Если кто подскажет, как это сделать более элегантно - буду благодарен.
  • Goga · 1 year ago
    перед X-Accel-Redirect вставьте:

    header("Content-Disposition: attachment; filename=\"" . $filename . "\"");

    где $filename - имя файла (только имя, путь - отсутствует).
    После этого все браузеры должны открывать окно с приглашением сохранить файл или открыть. Ну у MIME типы уже сам nginx отдаст если в его конфиге добавлено include conf/mime.types
  • Ivan · 1 year ago
    Добрый день. А никто не сталкивался со следующей ситуацией: есть файл который отдается через X-Accel-Redirect. При попытке его скачать с двух различных машин - качается только на одной. Проблема имеет место только при скачивании через браузер (тестировался ie6-7 и ff2), выдается невозможность отобразить страницу. При использовании менеджера закачек - все качается нормально.
  • Ivan · 1 year ago
    в тему предыдущего коммента - вопрос закрыт. проблема была в размере файла - больше 4 гб. Интернет експлорер побоялся что на машине фат32 и не стал качать.
  • Vladimir · 1 year ago
    При попытке использовать описанную схему контролируемого скачивания (nginx+apache+php) столкнулся со след. проблемой: иногда вместо предложения сохранить файл в браузер выдается ошибка :
    502 Bad Gateway
    nginx/0.5.33
    При этом в PHP скрипт передается $path с запорченным окончанием - последние несколько символов заменены на 0x0. В error.log nginx'а при этом выдается сообщение:
    upstream prematurely closed connection while reading response header from
    upstream ...
    Как с этим бороться?
  • Morales · 1 year ago
    >What about the rest of the code for the rails controller.
    >This confuses me because you have to render something….?
    >I have nginx setup and I am setting the header, but then what? >render :text => “”???

    render :nothing => true
  • алексей · 1 year ago
    Про использование в lighttpd контролируемых скачек с помощью скриптов можно поподробнее?
  • Stas · 1 year ago
    Спасибо за статью.

    С заголовками таки что-то не то - FF и IE отрабатывают нормально, а вот Опера упорно предлагает сохранить в html ...
  • А. Александров · 1 year ago
    Чтобы правильно отдавать тип и имя файла:
    <?php
    header("Content-type: video/mpeg");
    header("Content-Disposition: attachment; filename=\"file.mpeg\"");
    //или подставить свой
    Чтобы не задалбывали потоками reget, dmaster etc..
    в nginx.conf
    http {
    limit_zone one $binary_remote_addr 10m;
    ...
    location /files {
    root /home/www/.../files;
    internal;
    limit_conn one 1;
    }
    где one-имя зоны, 1-количество подкл. с одного ip
  • А. Александров · 1 year ago
    Кстати, есть такая функция в php
    string mime_content_type ( string filename)
    не тестировал, но если работает - удобно