Как я могу проверить, существует ли файл в nginx? в противном случае запустить правило перезаписи - PullRequest
2 голосов
/ 28 марта 2019

доброго времени суток всем,

Чтобы изменить размеры изображений на лету, я решил использовать такой сервис, как Kraken или imgix.

Мои изображения будут отображаться так: site.com/img/path-to-img-s250x250.jpg и чего я хотел бы добиться: если изображение path-to-img-s250x250.jpg существует, то я его покажу, а если нет, то запустите правило перезаписи nginx, чтобы изменить размер исходного изображения и сохранить его.

Isэто что-то возможно, или я должен делать проверки с PHP?

Также есть ли у вас какие-либо лучшие идеи о том, как лучше справиться с изменением размера изображений на лету?

Большое спасибо

location /img/ {
    try_files $uri @getImg @resize;
}

location @getImg{
    rewrite "img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+).([0-9]{5}).(jpg|jpeg|png|gif|ico)$" /img/$1/$2-$3x$4.$6 break;
}

location @resize{
    rewrite "img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+).([0-9]{5}).(jpg|jpeg|png|gif|ico)$" $scheme://$host/image?path=$1&file=$2&ext=$6&w=$3&h=$4 break;
}

и вот ссылка на изображение: site.com/img/prods/1002/filename-200x200.12345.jpg

12345 для управления версиями

1 Ответ

2 голосов
/ 28 марта 2019

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

Используйте регулярное выражение location для захвата элементов URI. Расположение регулярных выражений оценивается по порядку, поэтому их положение в файле конфигурации может быть значительным. Подробнее см. в этом документе .

Если последний параметр оператора try_files является URI. он сгенерирует внутреннее перенаправление.

Например:

location ~ "^/img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+)\.([0-9]{5})\.(jpg|jpeg|png|gif|ico)$" {
    try_files $uri /img/$1/$2-$3x$4.$6 /image?path=$1&file=$2&ext=$6&w=$3&h=$4;
}

Вышеописанное не будет работать само по себе, так как многие PHP-скрипты используют первоначально запрашиваемый URI (REQUEST_URI) для определения маршрута.

Вы можете создать пользовательское местоположение для явной установки параметров REQUEST_URI и SCRIPT_FILENAME.

Например:

location = /image {
    include        fastcgi_param;
    fastcgi_pass   ...;
    fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_param  REQUEST_URI      $uri$is_args$args;
}

Основывайте этот блок на существующем коде (приведенное выше является лишь предположением). Сначала мы включаем файлы глобальной конфигурации, а затем переопределяем SCRIPT_FILENAME и REQUEST_URI. Я предположил, что index.php обрабатывает маршрут /image.

...