Как перехватывать ссылку на изображения с помощью скрипта

Дана ссылка типа: https://domain.com/catalog/img/234234.jpg?w=540&h=440. Как перехватить все ссылки, какие содержать GET параметры и обработать через определенный скрипт?
Цель скрипта сжать картинку на лету( или же достать ее с кеша).


Ответы (1 шт):

Автор решения: teran

допустим вы запрашиваете файл /img/123.png?w=100&h=50. Фактически хотите проверить, есть ли у же версия с этими размерами, если есть отдать ее, если нет, то отресайзить, сохранить и вернуть.

Можете, например, хранить оригиналы в папке /img/originals а ресайзы в /img/resized.

Например, оригинал 123.png в /originals/123.png, а когда запрашиваем /img/123.png?w=100&h=50 то сохраняем результат в /img/resized/123_w100_h50.png

Апач файл правил прогоняет не один раз, а несколько. Флаг [L] говорит, что надо преврвать текущий прогон, и перейти к следующему. Если на следующем этапе никакие правила не сработали, то результат отдается клиенту.

Итак,проверяем что в запросе (несколько сумбурно написано мб). Проверяем, что запрашивается файл из img но не из img/resized, также проверяем, что указаны w,h (с этим на самом деле проблема, поскольку порядок аргументов может быть различен).

RewriteCond %{REQUEST_URI}  ^/img/
RewriteCond %{REQUEST_URI} !^/img/resized
RewriteCond %{QUERY_STRING}  (^|&)w=(\d+)&h=(\d+)
RewriteRule ^img/(.*?)\.(png|jpg)  /img/resized/$1_w%2_h%3.$2 [L,QSA]

Так что этим правилом любой запрос к /img/123.png?w=100&h=50 перенаправляется в /img/resized/123_w100_h50.png?w=100&h=50 параметры этом остаются за счет флага [QSA]. Обработчик уходит на второй круг [L]. Тут у нас уже будет resized и данное правило не сработает.

Теперь папке resized и если файла нет, то вызывает пхп скрипт, который генерит этот файл. Если есть, то он просто отдается клиенту. Примерно так

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^img/resized/(.*)   img/img.php?f=$1 [L,QSA]

наличие в обоих запросах флага QSA позволит вам в php скрипте обратиться к w,h параметрам. Внешних редиректов тут тоже никаких не происходит. Останется еще обработать доступ к файлу без параметров w,h и перенаправить его в /img/originals/, или не хранить их там.

→ Ссылка