Нужна помощь с .htaccess

S
На сайте с 13.10.2014
Offline
169
697

Добрый день, господа. возник вопрос, который сам я решить красиво не могу, поэтому вынужден "за поможением обратиться"

в общем есть сайт в котором 100500 картинок разных размеров

все они должны лежать в папке files

то-есть структура примерно выглядит так


- files
-- images
--- upload
--- i180x180
--- i240x240
- css
- js
- core
index.php

так вот основная картинка загружается в папку аплоад, а уменьшенные ее варианты тянутся из соответствующих папок. и если там файла нет, то как полагается дает 404ю.

а теперь задача.

Как сделать так, чтобы при обращении к папке, в которой нет нужного файла, запускался-бы index.php -- который должен генерить соответствующую миниатюру.

постоянная нагрузка php для выдачи тоже не вариант. Итак планируемая нагрузка будет достаточно большой

S
На сайте с 30.09.2016
Offline
469
#1

На мой взгляд, Вы не с той стороны копаете. Если запрос на показ картинки идёт непонятно от кого - так и нечего её генерить. А если запрос на показ формируется скриптом движка, то перед формированием запроса надо убедиться в существовании соответствующего файла - а в случае отсутствия такового подключить функцию, которая его создаст.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
S
На сайте с 13.10.2014
Offline
169
#2

Да нет, это нормальное решение, особенно, если файлы неизвестно откуда и кто будет обращаться к фалам

в общем вот такое решение


RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.+\.(jpe?g|gif|png))$ ../../index.php?preset=$1&file=$2 [NC]

кладется в папку images

E
На сайте с 22.06.2016
Offline
45
#3

Это все обычно делается централизованно. В корне сайта размещается основной файл сайта с т.н. фронт-контроллером и .htaccess примерно такого типа:


RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.* /index.php

Фронт-контроллер выполняет обращение к роутеру, по итогам которого запускается обработчик с параметром вроде images/upload/i180x180/image.jpg (первый элемент пути обычно используется для выбора самого обработчика; в созданных мной сайтах обычно и images нет, т.к. этот каталог размещается в корне сайта наравне с каталогом files и сам по себе может быть завязан на одноименный обработчик; upload обычно тоже по-другому использую). Параметр может быть не один, а являться совокупностью уже выделенных из показанной строки элементов: в последнем элементе находится краткое имя файла, в предпоследнем – требуемый формат. Вы можете заранее при загрузке разместить в соответствующей таблице БД нужные строки, чтобы самостоятельно не заниматься проверкой их корректности в момент обращения к файлу – ядро сайта самостоятельно сделает сверку и в случае несовпадения не будет вызывать соответствующий обработчик, а сразу выдаст ошибку.

Если кратко, вы можете во время загрузки файла не создавать дополнительные файлы, а лишь добавить соответствующие им записи в БД.

S
На сайте с 13.10.2014
Offline
169
#4

egos, вы не поняли поставленной задачи.

ваше решение есть запуск копии скрипта при обращении к файлу. А теперь представьте. у вас на странице 100 миниатюр, на страницу обращаются, примерно 1-2 раза в секунду. соответственно мы будем иметь 200 запусков php скрипта в секунду.

даже если сделать для этого отдельный элемент контроллера придется загружать десяток файлов (в виде начального бутлоадера)

Такую нагрузку не каждый сервак выдержит. да и памяти сколько оно сожрет, просто на старт

апд, однако оно удобно, если надо попрятать приватные файлы от чужих глаз.

E
На сайте с 22.06.2016
Offline
45
#5

Это вы, видимо, не поняли, что я написал. Я всего лишь сказал, что то, что вы показали, обычно делается более централизованным путем.

---------- Добавлено 01.11.2016 в 20:29 ----------

Существуют не слишком масштабные каркасы. Отдельная точка входа используется лишь в крайних случаях. Ничего сверхтяжеловесного в вашей задаче я не увидел. После первого обращения к миниатюре она будет сгенерирована скриптом и в дальнейшем отдаваться непосредственно сервером. Кстати, при первом обращении она тоже может отдаваться сервером – для этого у всех популярных серверов есть поддержка специальных неофициальных заголовков (на уровне ядра или расширений).

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий