Рейтинг:2

Перенаправление NGINX на кэшированный файл в подпапке

флаг ke

У меня есть программа, которая создает оптимизированные версии изображений, загружаемых в /картинки/ папка на веб-сервере. Он проходит по подпапкам и в каждой из них создает .оптимизировано папка с оптимизированной версией, если он как минимум на определенный размер меньше оригинала. Моя цель — проверить, существует ли такая оптимизированная версия, обслуживать ее, если она существует, и обслуживать оригинал в противном случае (в некотором смысле, например, как gzip_static обслуживает версию файла .gz, если она существует).

Я использую NGINX в качестве прокси-сервера перед Apache, поэтому, хотя я привык решать подобные проблемы с помощью htaccess, я пытаюсь сделать это изначально в NGINX, чтобы серверу не приходилось передавать запрос Apache. В .htaccess, я мог бы сделать что-то вроде этого:

RewriteCond %{REQUEST_FILENAME} ^(/images/(?:.*/)?)(.*?)$ [ИЛИ]
RewriteCond $1.optimized/$2 -f
RewriteRule .* $1/.optimized/$2 [L]

Есть ли хороший способ справиться с этим непосредственно в NGINX? Большинство подобных случаев использования, которые я нашел, сохраняли все кэшированные/оптимизированные файлы в одной кэшированной папке, в отличие от структуры, которую я описываю.

djdomi avatar
флаг za
`if ($request_filename ~ "^/(.*/)+(.*?)$"){ установить $rule_0 1; } если (-f /${fref_0_0}/.оптимизированный/${fref_0_1}){ установить $rule_0 1; } если ($ правило_0 = "1"){ переписать /.* /$1/.optimized/$2 последним; }` вы можете проверить это, если я правильно прочитал ваш запрос, это может сработать, иначе мы должны использовать пробные файлы
Richard Smith avatar
флаг jp
Файлы находятся в папке `/images/`. URI тоже начинается с `/images/`?
флаг ke
@djdomi Спасибо! Через некоторое время у меня будет доступ к моему серверу, и я попробую.
флаг ke
@ Ричард Смит Да. Я ошибочно убрал это из примера htaccess. Я исправил это сейчас. Спасибо!
Рейтинг:3
флаг jp

Вы можете использовать регулярное выражение место расположения для извлечения первой и второй частей URI. Использовать try_files утверждение для поиска в файловой системе каждого файла по порядку.

Например:

расположение ~ ^(/images/.*?)([^/]+)$ {
    try_files $1.optimized/$2 $1$2 =404;
}
флаг us
Я думаю, что порядок должен быть `try_files $1.optimized/$2 $1$2 =404`, чтобы использовалась оптимизированная версия, если она существует.
Richard Smith avatar
флаг jp
Упс. Зафиксированный.Спасибо @TeroKilkanen
флаг ke
Спасибо огромное! В моем регулярном выражении была ошибка (предполагалось, что будет задействован хотя бы один подкаталог, чего нельзя предположить), хотя даже когда я переключаюсь на `^(/images/(?:.*/)?)(. *)$` похоже, он не "активируется". пытаюсь понять почему....
флаг ke
Ой! Я понял, что мой proxy_pass мешает обслуживать статический контент... Мне придется поработать над этим, но это, по крайней мере, объясняет, почему он не применялся. Еще раз спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.