Задать вопрос

Nginx config, как?

Привет.


Надо составить правило location, но с nginx/perl знаком слабовато.


При обращении к /original/$ID. jpg|png|gif


Надо чтобы отдавалась картинка по пути


original/

последней символ md5($ID) /

первые 2 символа md5($ID) /

3 и 4 символ md5($ID). jpg|png|gif
  • Вопрос задан
  • 5646 просмотров
Подписаться 6 Оценить 1 комментарий
Решения вопроса 1
iSage
@iSage
wiki.nginx.org/EmbeddedPerlModule
Как-то так (не тестировал, но должно вроде работать):
nginx.conf:
http {
    perl_require myhandler.pm;
    ...
    server {
        ...
        location ~* /original/\.(gif|jpg|png)$ {
            perl  myhandler::handler;
        }
    }
}


myhandler.pm:
package myhandler;
use nginx;
use Digest::MD5 qw(md5_hex);

sub handler {
  my $r = shift;
  if ($r->filename=~m|/original/(.*?)\.(jpg|gif|png)|) {
      my $id_md5=md5_hex($1);
      my $filename="/original/".substr($id_md5,31,1)."/".substr($id_md5,0,2)."/".substr($id_md5,2,2).".".$2;
      $r->sendfile($filename);
  }
  return OK;
}
 
1;
__END__
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
kekekeks
@kekekeks
Вынесите эту логику в скрипт, а потом отдавайте картинку через внутренние перенаправления.
Ответ написан
@IlVin
Функция вычисления MD5 в конфиге nginx только в эфемерных планах..., а пока вычислить MD5 от чего-то невозможно (без стороннего модуля).

Совсем другое дело, если вдруг $ID сам окажется MD5 суммой…

Тогда (код не тестировался):
location /original/ {
rewrite ^/original/([0-9a-f][0-9a-f])([0-9a-f]+)([0-9a-f])\. (jpg|png|gif)$ /original/$3/$1/$1$2$3.$4 last;
}

Более подробно читайте документацию:
sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html
Ответ написан
Комментировать
ozware
@ozware
Может это чем-то поможет: sysoev.ru/nginx/docs/http/ngx_http_secure_link_module.html

Имхо, в nginx такое не сделать, надо как-то по-другому
Ответ написан
@IlVin
Вспомнил! Сейчас буду учить плохому…
Вот здесь catap.ru/blog/2009/05/13/nginx-crc32_name-and-md5_name/ патч к nginx, который считает MD5 сумму, только прочитайте пожалуйста все каменты по ссылке, прежде, чем его применять…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы