Table of Contents
Данный скрипт повышает на несколько процентов оценку скорости для мобильной версии сайта по https://developers.google.com/speed/pagespeed/insights/
- От CMS не зависит, т.к. сам выбирает из всех запросов на сервер только картинки
- PHP ресайзит картинок шире 375px до указанного размера на основании заголовка мобильной версии браузера.
php файл берем здесь: https://github.com/nofikoff/image_optimyze
.htaccess добавить строки:
## РЕСАЙЗИМ КАРТИНКИ С КЭШЕМ by Novikov RewriteEngine On RewriteCond %{HTTP_USER_AGENT} ^.*(Android|BlackBerry|Phone).*$ [NC] RewriteCond %{REQUEST_URI} ^(.*\.png|.*\.jpg|.*\.jpeg|.*\.gif)$ # Если хочешь чтобы был реджирект на новый размер картинки то ставь [L,R] иначе [L] без редиректа RewriteRule ^(.*)$ /thumb.php?width=375&image=%1 [L]
Установка
- php файл thumb.php положить в корень проекта
- в корне добавить в существующий .htaccess соедержимое блока что выше. если .htaccess не существует – создать
Описание
- .httaccess фильтр для картинок. Влияет ТОЛЬКО на запрашиваемые файлы типа картинка И ТОЛЬКО С МОБИЛЬНЫХ по USER Agent
- если мобильный посетитель пытается скачать картинку – вызывается скрипт thumb.php и вместо картинки выдается его содержимое
- алгоритм работы thumb.php скрипта:
- если ширина картинки меньше заданной 375 – ничего не делаем, выдаем оригинал картинки
- если ширина картинки больше заданного порога 375, пропорционально ресайзим ее по ширине до 375
- сохраняем полученый ресайз в кэш сайта, чтобы не ресайзить повторно одну и туже картинку
CLOUDFLARE ПРОБЛЕМА
- CDN клаудфлар обнуляет этот скрипт оптимизации картинок, т.к. запоминает первый попавшийся вариант картинки. В зависимости от того, какой размер картингки скачали ПК юзверь или Мобильный пользователь
- Варианты с редиректом на новый адрес картинки для мобильных пользователей – не работает
- Максимум чем данный скрипт может быть полезен (для проектов закрытых Cloudflare), это автоматически оптимизировать все картинки в проекте без учета типа пользователя, например на максимальную ширину картинок не более 800 пикселей. И сохранить их в кэше сайта, не трогая оригиналы.
UPDATED CLOUDFLARE
- Если сайт закрыт клаудфларом – .htaccess для нашей задачи бесполезен (см. выше обоснование)
- На стороне клаудфрара есть нужный нам механизм (до 100.000 запросов в сутки бесплатно) Workers https://developers.cloudflare.com/workers/
- Добавляем новый скрипт Wokers и прикрепляем его к роутеру вида (для вордпресса например так) MYSITE.com/wp-content/uploads/*
- Скрипт на стороне клаудфлара повторяет тот же механизм с редиректом на ресайзнутую картинку
- TODO: переписать скрипт ниже чтобы вместо редиректа на ресайз – выдавалась сама картинка нового размера.
/** * sets up routes and redirects them to a location based on a map * @param {Request} request */ async function handleRequest(request) { let requestURL = new URL(request.url) let location = "https://" + requestURL.hostname + "/thumb.php?width=375&image="+requestURL.pathname let neededExtRegExp = new RegExp(/\.(jpeg|jpg|png|gif)$/) let device = request.headers.get('CF-Device-Type') let userAgent = request.headers.get('User-Agent') || '' if (neededExtRegExp.test(requestURL.pathname)) { //if (device === 'mobile') { if (userAgent.includes('Phone') || userAgent.includes('Android') || userAgent.includes('BlackBerry') ) { if (location) { return Response.redirect(location, 301) } } } //return the original request return fetch(request) } addEventListener('fetch', async event => { event.respondWith(handleRequest(event.request)) })