Использование rewrite переменных для дальнейших операций
Igor Sysoev
is at rambler-co.ru
Tue Apr 18 15:04:31 MSD 2006
On Tue, 18 Apr 2006, Eugene wrote:
> Для обхода прокси, запрещающих скачивание использую следующую схему с
> обращением расширений
>
> location / {
> root html;
> index index.html index.htm;
> autoindex on;
> if (!-f $request_filename) {
> rewrite ^(/.+)?/([^/]+)\.(.)(.)(.)(.?)$ /$1/$2.$6$5$4$3 last;
> #add_header Content-Disposition 'attachment;
> filename=$2.$6$5$4$3';
> add_header Content-Type application/octet-stream;
> }
> if ($slownet) {
> limit_rate 3k;
> }
>
> т.е. /dir/file.3pm --> /dir/file.mp3
>
> Есть желание выдавать оригинаьное имя файла в заголовке, для этого прописываю
> его в rewrite,
> но заголовок не возвращается.
> Однако если зайти по адресу / то предлагает скачать страницу и выдает
> заголовок
> content-disposition: attacmhent; filename=.
>
> Где грабли?
Проблема в том, что большинство директив статические (декларативные),
а исполняются только директивы ngx_http_rewrite_module.
http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#internals
В данном случае происходит следующее:
Если файла нет, то выполяняется rewrite и опять ищется location (из-за last).
В новой конфигурации директив add_header уже нет.
Вот такое должно работать:
location ~ /$ {
root html;
index index.html index.htm;
autoindex on;
}
location / {
root html;
index index.html index.htm;
uninitialized_variable_warn off;
if (!-f $request_filename) {
rewrite ^(/.+)?/([^/]+)\.(.)(.)(.)(.?)$ /$1/$2.$6$5$4$3;
set $name $2.$6$5$4$3;
}
if ($slownet) {
limit_rate 3k;
}
add_header Content-Disposition 'attachment; filename=$name';
add_header Content-Type application/octet-stream;
}
Игорь Сысоев
http://sysoev.ru
More information about the nginx-ru
mailing list