Configuración extraña de nginx: múltiples reglas de reescritura no funcionan

Configuración extraña de nginx: múltiples reglas de reescritura no funcionan

Tengo una aplicación que sabe cómo preparar algunas imágenes especiales y se ejecuta en una máquina separada (estoy intentando usarla como servidor de imágenes).

Cuando estas imágenes son preparadas y entregadas por la aplicación, también se guardan psíquicamente en una ruta de acceso público como /image/files/medium/562.jpg para evitar que la aplicación se ejecute una y otra vez en futuras solicitudes.

Mi aplicación implementa un patrón de controlador frontal, por lo que necesito enviar una solicitud a mi aplicación como /thumbnail/process/?qs=1&qs=2no /thumbnail.phpo algo así.

También necesito enmascarar la URL real de mi procesador en miniatura para los usuarios finales.

En este punto, el flujo es como se muestra a continuación:

  1. El usuario final realiza una solicitud de imagen como/picture/small/518.jpg
  2. Nginx lo detecta y lo reescribe /image/files/small/518.jpgporque en realidad no hay una picturecarpeta.
  3. Si /image/files/small/518.jpgexiste, nginx debería servirlo directamente en lugar de pasar la solicitud a la aplicación.
  4. Si no es así (la imagen no existe), nginx tiene que reescribir (o redirigir) nuevamente y pasar la solicitud a la aplicación mediante una uri personalizada como/thumbnail/process/?size=small&model=866
  5. Además, ngnix no debería aceptar otras solicitudes si no es una solicitud de imagen y debería devolver un 444 inmediatamente.

Entonces, intenté resolver estos problemas escribiendo reglas personalizadas para nginx, pero no funcionó. No hay ningún problema con las imágenes ya procesadas, pero genera respuestas 404 no encontradas en lugar de pasar la solicitud a la aplicación.

No puedo encontrar qué está mal con esta configuración y cuál es el punto que me falta.

server {
  listen      127.0.0.1:80;
  server_name image.mydomain.com;
  root        /var/www/public_html;

  location / {
     # I know if is evil.
     # Don't pass request to the application if it's not a image request!
     if ( $uri !~ ^/(image|picture|thumbnail)/(.*)$ ) {
        return 444;
     }
  }

  # Real request uri for image.
  location ~ "^/picture/(small|medium|large)/([a-zA-Z0-9]).jpg$" {
     set $size $1;
     set $model $2;
     rewrite ^ /image/files/$size/$model.jpg last;
  }

   location ~ "^/image/files/(small|medium|large)/([a-zA-Z0-9]).jpg$" {
       try_files $uri /thumbnail/process/?size=$1&model=$2;
       break;
   }

   location ~ ^/thumbnail/process/(.*)$ {
        index index.php;
        try_files $uri $uri/ /index.php?$args;
   }

   include fastcgi_config.conf;
}

Y el contenido de fascgi_config.conf:

fastcgi_intercept_errors on;

location ~ .php$ {
    fastcgi_pass  my-www-pool;
    fastcgi_index index.php; 

    fastcgi_split_path_info ^(.+.php)(/.+)$;

    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    #fastcgi_param  REQUEST_URI       $uri?$args;

    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  HTTPS              $https if_not_empty;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    fastcgi_param PATH_INFO           $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED     $document_root$fastcgi_path_info;
}

fastcgi_param  REDIRECT_STATUS    200;

información relacionada