RewriteRule с проверкой файла и изменением размера изображения - PullRequest
0 голосов
/ 12 мая 2011

У меня сейчас есть такая структура папок:

img.domain.com/
    boats/
        boat1/
            1.jpg
            2.jpg
    trees/
        tree1/
            1.jpg
            2.jpg

У меня уже есть скрипт PHP на img.domain.com / index.php , который изменяет размер изображения и RewriteRule, который позволяет мне получить доступ к изображению (изменение размера или нет) следующим образом: img .domain.com / лодки / boat1 / 1 / 200/200 / а-большой boat.jpg

Для этого я использую:

RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)\.([^/]+) index.php?folder=$1&id=$2&file=$3&ext=$7&w=$4&h=$5&description=$6 [NC]

Это все хорошо работает.

Что мне нужно, так это после создания кэшированного изображения с помощью PHP получить к нему доступ, если он существует, но только с помощью RewriteRule. Я не хочу проверять файл с помощью PHP.

Я прочитал этот вопрос ( Лучший способ кэширования изображений с измененным размером, используя PHP и MySQL ), который имеет довольно хорошее решение:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

Но я не могу приспособиться к своему делу.

Есть идеи?

1 Ответ

0 голосов
/ 13 мая 2011

Я нашел решение для своего собственного вопроса.

Во-первых, скрипт PHP должен создать кешированный файл именно там, куда указывает URL.Это означает, что после изменения размера изображения сохраните его на этом пути.

В приведенном мной примере: img.domain.com / boats / boat1 / 1/200/200 / a-big-boat.jpg (который не существует при первом вызове) сохранит изображение на этом пути ( img.domain.com / boats / boat1 / 1/200/200 / )с именем a-big-boat.jpg и размером 200x200.

Теперь .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)\.([^/]+) index.php?folder=$1&id=$2&file=$3&ext=$7&w=$4&h=$5&description=$6 [NC]

Он запросит изображение, а если нетсуществует, вызовите index.php с этими параметрами и создайте кеш.В следующий раз он получит кэшированный файл без прохождения через index.php.Это (.htaccess) лучше, чем проверка, существует ли файл с PHP.

Конечно, RewriteRule предназначен только для моего случая.

И настройка только для того, чтобы избежать перечисления, если пользователь пытается получить доступ к чему-либокак img.domain.com/boats/1/200/ или любая другая папка, созданная системой кэширования.Поместите это как первое условие перезаписи.

RewriteCond %{REQUEST_FILENAME} -d
ErrorDocument 403 /forbidden.php

Внимание! Будьте внимательны с размером и именем файла.В моем случае, поскольку окончательное имя файла (a-big-boat.jpg) не совпадает с исходным (1.jpg), пользователи могут создавать бесконечные файлы кэша, просто меняя окончательное имя.То же самое для размера.

Проверьте требуемый размер на соответствие стандартным размерам, установленным вами.Что касается имени, я получу уникальное имя из базы данных.Это будет проверять БД только один раз на изображение / размер и никогда не проверять снова после кэширования, так что это не проблема.Если имя правильное, создайте кеш, если не отправите «image not found».

Надеюсь, это может помочь другим людям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...