Seltsame Nginx-Konfiguration: Mehrere Umschreibregeln funktionieren nicht

Seltsame Nginx-Konfiguration: Mehrere Umschreibregeln funktionieren nicht

Ich habe eine Anwendung, die einige spezielle Bilder vorbereiten kann und die auf einem separaten Computer ausgeführt wird (ich versuche, sie als Bildserver zu verwenden).

Wenn diese Bilder von der Anwendung vorbereitet und bereitgestellt werden, werden sie auch psychisch in einem öffentlich zugänglichen Pfad wie /image/files/medium/562.jpg gespeichert, um zu verhindern, dass die Anwendung bei weiteren Anforderungen immer wieder ausgeführt wird.

Meine Anwendung implementiert das Front-Controller-Muster, daher muss ich eine entsprechende Anfrage an meine App senden /thumbnail/process/?qs=1&qs=2oder /thumbnail.phpso etwas in der Art.

Außerdem muss ich die echte URL meines Miniaturbildprozessors vor Endbenutzern verbergen.

An dieser Stelle läuft es wie folgt ab:

  1. Der Endbenutzer stellt eine Bildanfrage wie/picture/small/518.jpg
  2. Nginx erkennt es und schreibt es neu, /image/files/small/518.jpgda eigentlich kein pictureOrdner vorhanden ist.
  3. Wenn /image/files/small/518.jpges vorhanden ist, sollte Nginx es direkt bereitstellen, anstatt die Anforderung an die App weiterzuleiten.
  4. Wenn dies nicht der Fall ist (das Bild existiert nicht), muss nginx es erneut umschreiben (oder umleiten) und die Anfrage per benutzerdefinierter URI an die App weiterleiten, wie/thumbnail/process/?size=small&model=866
  5. Außerdem sollte ngnix keine anderen Anfragen akzeptieren, wenn es sich nicht um eine Bildanfrage handelt, und sofort eine 444 zurückgeben.

Ich habe also versucht, diese Probleme zu lösen, indem ich benutzerdefinierte Regeln für nginx geschrieben habe, aber es funktioniert nicht. Es gibt kein Problem mit bereits verarbeiteten Bildern, aber es werden 404-Antworten „Nicht gefunden“ ausgegeben, anstatt die Anfrage an die Anwendung weiterzuleiten.

Ich kann nicht herausfinden, was an dieser Konfiguration falsch ist und was der Sinn ist, den ich übersehe.

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;
}

Und Inhalt von 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;

verwandte Informationen