Как перехватывать ссылку на изображения с помощью скрипта
Дана ссылка типа: https://domain.com/catalog/img/234234.jpg?w=540&h=440.
Как перехватить все ссылки, какие содержать GET параметры и обработать через определенный скрипт?
Цель скрипта сжать картинку на лету( или же достать ее с кеша).
Ответы (1 шт):
допустим вы запрашиваете файл /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/, или не хранить их там.