Re[2]: X-Accel-Redirect на другой порт

Pavel V. pavel2000 at ngs.ru
Wed Nov 18 23:26:20 MSK 2009


Здравствуйте, Michael.

Вы писали 18 ноября 2009 г., 22:49:54:

> В Срд, 18/11/2009 в 12:31 +0600, Artem Bokhan пишет:


> Можно подробнее?
> Как дело обстоит в моем случае: 
> Есть ссылка http://localhost/file/download , где file - id файла. Зайдя
> по этой ссылке клиент получает заголовки, среди которых есть
> X-Accel-Redirect, который равен /media/secret/filename - вот его нужно
> переправить на другой порт, т.е. на
> http://localhost:8080/media/secret/filename

 Разделите понятия "внутренний редирект" и "внешний редирект".
 Внутренний редирект - это то, как мы будем обрабатывать уже имеющийся
 полученный запрос. Внешний редирект - браузер сделает новый запрос,
 возможно что и в совершенно другое место. Отдать файл с другого порта
 - это обязательно новое TCP-соединение, соответственно, обязательно
 должен быть новый запрос.

 Пример (схема) конфигурации.

 При переходе по ссылке http://host/files/file/download мы (без
 участия скриптов сайта) перебрасываем клиента на другой порт, делая
 внешнее перенаправление на ссылку http://host:8080/files/file/download
 Клиент делает новый запрос, этот запрос пробрасывается на бэкенд.
 Ответ бэкенда используется в качестве указания, какой отдать файл.

 server {
     listen 1.2.3.4:80;
     ...
     
     location /files/ {
              rewrite ^/(.*)$ http://$http_host:8080/$1 permanent;
     }
     ....
 }

 server {
     listen 1.2.3.4:8080;

     location /files/ {
          proxy_pass http://backend/files/;
          ...
     }
     
     location /media/secret/ {
         internal;
         alias /path/to/secret/;
     }
 }

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

 Если на одном сервере по адресу /чтототам можно получить как файлы
 так и страницы, то перенаправление на другой порт через обычный
 внешний редирект 30х ваш движок сайта должен делать самостоятельно.

 Смысл делать внутренний редирект, на location, в котором будет
 произведен внешний редирект, как написано в цитате ниже, полностью
 отсутствует, поскольку прямой линк на файл всеравно никто не отдает,
 то придется делать запрос к движку за X-Accel-Redirect _еще раз_.

>> Сделайте x-accel-redirect на location, в котором формируется редирект
>>
>> location /secret {
>>             add_header Location "http://$somethingyouneed";
>>             return 302;
>> #         internal;
>> }

 Если есть возможность выдать перенаправление, содержащее путь (часть
 пути) к файлу, то это делается также обычным образом, без использования
 X-Accel-Redirect, перенаправлением клиента по нужной ссылке
 http://host:8080/media/secret/file.ext . При этом теряются функции
 "контролируемого скачивания" и "секретность" расположения файлов.

 Чтобы потеря функции контролируемого скачивания не происходила, но
 чтобы облегчить жизнь (нагрузку на движок), есть модуль
 http://sysoev.ru/nginx/docs/http/ngx_http_secure_link_module.html
 с его вариациями, и аналогичные ему
 http://wiki.nginx.org/NginxHttpAccessKeyModule
 http://wiki.nginx.org/NginxHttpSecureDownload
 Использование модулей предполагает генерирование движком сайта ссылки
 с уникальным для клиента ключом (возможно, с другим адресом/портом
 подключения), отправку клиенту внешнего  перенаправления, новый
 запрос от клиента этой ссылки, проверку  ссылки веб-сервером,
 раздающим файлы, самостоятельно, без участия движка.

 PS: не придумывайте пожалуйста "примеры текущей конфигурации",
 "listen localhost:80;" выглядит слегка некорректно,
 перечень локейшнов также неполон....
 
> Вот пример текущей конфигурации nginx:
> server {
>     listen localhost:80;    
>     location /media/ {
>         alias /path/to/static/;
>     }                            
> }

> server {
>     listen localhost:8080;
>     location /media/secret/ {
> internal;
>         alias /path/to/secret/;
>     }
> }

> Какой именно тут надо дописать location ?




-- 
С уважением,
 Pavel                          mailto:pavel2000 at ngs.ru






More information about the nginx-ru mailing list