@Hecktosaurus
Люблю писать код под специфические задачи

Возможно ли выполнить php по цепочке в nginx?

Здравствуйте! Нужно конвертировать картинки в webp, делаю это своим скриптом. Проблема в том, что в некоторых случаях исходников не существует и они генерируются на лету другим скриптом.

Мне бы как-то задать условие, по которому бы проверялось, если существует файл по строке запроса - выполнять один скрипт, если не существует - выполнять другой соответственно.

Пытался реализовать вот такой конструкцией, но складывается ощущение, что управление всегда уходит в последний скрипт ( @shop_thumb ), а до основного ( @webp_gen ) дело вовсе не доходит.

# рулим правилами для преобразования
location ~* ^.+\.(jpe?g|png)$ {
    types {
        image/jpeg jpeg jpg;
        image/png png;
        image/webp webp;
    }
    error_page   404  =  @shop_thumb;
    expires 365d;
    try_files  $uri.webp @webp_gen @shop_thumb;
}
# локейшн для конвертирования
# по идее, если сорца не существует, webp-converter.php отдаст 404 и управление уйдёт в @shop_thumb
location @webp_gen {
    error_page   404  =  @shop_thumb;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/run/php/php7.2-fpm-ers.sock;
    fastcgi_param  SCRIPT_NAME  /webp/webp-converter.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/webp/webp-converter.php;
}
# локейшн для генерации и сохранения сорца. Должен отрабатывать только тогда,
# когда $request_uri не существует.
# А затем, после повторного обращения, уже должно срабатывать @webp_gen
location @shop_thumb {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/run/php/php7.2-fpm-ers.sock;
    fastcgi_param  SCRIPT_NAME  /products/thumb.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/products/thumb.php;
}


А вот часть кода webp-converter.php - если что-то идёт не так, возвращается 404:
$docRoot = rtrim($_SERVER["DOCUMENT_ROOT"], '/');
$requestUriNoQS = explode('?', $_SERVER['REQUEST_URI'])[0];
$relativeSrcPath = urldecode($requestUriNoQS);
$source = $docRoot . $relativeSrcPath; 

if (!file_exists($source)){
	// нужно записать в лог и крешнуться
	if ($debugmode){
		writeLog('Нет файла "'.$source.'"');
	}
	header("HTTP/1.0 404 Not Found");
	exit;
}


Можете подсказать, что я делаю неправильно?
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
# по идее, если сорца не существует, webp-converter.php отдаст 404 и управление уйдёт в @shop_thumb
location @webp_gen {
    error_page   404  =  @shop_thumb;


Что бы error_page обрабатывала коды ответов от fastcgi нужно это явно включить директивой fastcgi_intercept_errors.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы