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))
})