Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re[2]: X-Accel-Redirect на другой порт
Здравствуйте, 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@xxxxxx
|