Ngarobah ukuran gambar dina laleur

Dina ampir sagala aplikasi wéb anu ngagunakeun gambar, aya anu peryogi pikeun nyieun salinan leutik gambar ieu, sarta mindeng aya sababaraha format pikeun gambar tambahan.
Nambahkeun diménsi anyar kana aplikasi anu tos aya ogé nyababkeun nyeri sirah. Ku kituna tugas:

tugas

Hayu urang nunjukkeun daptar sarat:

  • Ngahasilkeun gambar tambahan tina format naon waé dina laleur tanpa ngenalkeun fungsionalitas tambahan kana aplikasi iraha waé salami aya aplikasi;
  • Gambar tambahan teu perlu dihasilkeun dina unggal pamundut;
  • Nonaktipkeun kamampuan pikeun ngahasilkeun gambar tambahan tina format anu henteu ditangtukeun.

Kuring bakal ngajelaskeun titik panungtungan, sabab rada contradicts titik kahiji. Upami urang ngadamel generasi gambar naon waé kabuka, teras aya kamungkinan serangan dina situs ku ngahasilkeun sajumlah ageung pamundut pikeun ngarobih ukuran gambar kana jumlah format anu henteu terbatas, janten kerentanan ieu kedah ditutup.

konfigurasi instalasi nginx

Pikeun ngajawab sarat di luhur urang peryogi set handap modul nginx:

Modul ngx_http_image_filter_module и ngx_http_secure_link_module teu dipasang sacara standar, ku kituna maranéhanana kudu dieusian dina tahap konfigurasi instalasi nginx:

phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module

konfigurasi nginx

Urang tambahkeun nu anyar kana konfigurasi host urang lokasi sareng parameter cache umum:

...
    proxy_cache_path /www/myprojects/cache levels=1:2 keys_zone=image-preview:10m;
...
    server {
...
        location ~ ^/preview/([cir])/(.+) {
        # Тип операции
            set                         $oper $1;
        # Параметры изображения и путь к файлу
            set                         $remn $2;
        # Проксируем на отдельный хост
            proxy_pass                  http://myproject.ru:81/$oper/$remn;
            proxy_intercept_errors      on;
            error_page                  404 = /preview/404;
        # Кеширование
            proxy_cache                 image-preview;
            proxy_cache_key             "$host$document_uri";
        # 200 ответы кешируем на 1 день
            proxy_cache_valid           200 1d;
        # остальные ответы кешируем на 1 минуту
            proxy_cache_valid           any 1m;
        }
        
        # Возвращаем ошибку
        location = /preview/404 {
            internal;
            default_type                image/gif;
            alias                       /www/myprojects/image/noimage.gif;
        }
...
    }
...

Kami ogé nambihan host énggal kana konfigurasi:

server {
    server_name                     myproject.ru;
    listen                          81;

    access_log                      /www/myproject.ru/logs/nginx.preview.access_log;
    error_log                       /www/myproject.ru/logs/nginx.preview.error_log info;

    # Указываем секретное слово для md5
    secure_link_secret              secret;

    # Ошибки отправляем она отдельный location
    error_page                      403 404 415 500 502 503 504 = @404;

    # location Для фильтра size
    location ~ ^/i/[^/]+/(.+) {
        
        # грязный хак от Игоря Сысоева *
        alias                       /www/myproject.ru/images/$1;
        try_files                   "" @404;
    
        # Проверяем правильность ссылки и md5
        if ($secure_link = "") { return 404; }
        
        # Используем соответсвующий фильтр
        image_filter                size;
    }

    # По аналогии остальные location для других фильтров
    location ~ ^/c/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;
        
        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;
    
        if ($secure_link = "") { return 404; }
    
        image_filter                crop  $width  $height;
    }
    
    location ~ ^/r/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;

        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;

        if ($secure_link = "") { return 404; }

        image_filter                resize  $width  $height;
    }

    location @404 { return 404; }
}

Hasilna, gambar tambahan tiasa dicandak nganggo tautan ieu:

* try_files - sénsitip kana spasi tur karakter Rusia, jadi kuring kungsi nyieun crutch kalawan alias.

Paké dina aplikasi wéb

Dina tingkat aplikasi wéb, anjeun tiasa ngalakukeun prosedur ieu (Perl):

sub proxy_image {
    use Digest::MD5     qw /md5_hex/;
    my %params = @_;
    my $filter = {
                    size    => 'i',
                    resize  => 'r',
                    crop    => 'c'            
                  }->{$params{filter}} || 'r';
    my $path = ($filter ne 'i' ?
                    ( $params{height} || '_' ) . 'x' . ( $params{width} || '_' ) . '/' :
                    ()
               ) . $params{source};
    my $md5 = md5_hex( $path . 'secret' );
    $path = '/preview/' . $filter . '/' . $md5 . '/' . $path;
    return $path;
}

my $preview_path = &proxy_image(
                    source  => 'image1.jpg',
                    height  => 100,
                    width   => 100,
                    filter  => 'resize'
                );

Sanajan kuring ogé bakal nyarankeun ngitung ukuran titingali.

Rakean

Nalika ngahapus gambar asli, sawangan, sacara alami, moal dipupus tina cache dugi ka cache teu sah, sareng dina kasus urang, sawangan tiasa aya sadinten saatos ngahapus, tapi ieu mangrupikeun waktos maksimal.

aslina

sumber: www.habr.com

Tambahkeun komentar