이상한 nginx 구성: 여러 재작성 규칙이 작동하지 않습니다.

이상한 nginx 구성: 여러 재작성 규칙이 작동하지 않습니다.

나는 특별한 이미지를 준비하는 방법을 알고 있으며 별도의 컴퓨터에서 실행되는 응용 프로그램을 가지고 있습니다(이미지 서버로 사용하려고 합니다).

이러한 이미지가 애플리케이션에 의해 준비되고 제공되면 추가 요청 시 애플리케이션이 계속해서 실행되는 것을 방지하기 위해 /image/files/medium/562.jpg와 같은 공개적으로 액세스 가능한 경로에 정신적으로 저장됩니다.

/thumbnail/process/?qs=1&qs=2내 애플리케이션은 전면 컨트롤러 패턴을 구현하므로 내 앱에 not /thumbnail.php또는 이와 유사한 요청을 보내야 합니다 .

또한 최종 사용자로부터 실제 썸네일 프로세서 URL을 가려야 합니다.

이 시점에서는 아래와 같은 흐름이 있습니다.

  1. 최종 사용자는 다음과 같은 이미지 요청을 합니다./picture/small/518.jpg
  2. /image/files/small/518.jpg실제로 폴더가 없기 때문에 Nginx가 이를 잡아서 다시 작성합니다 picture.
  3. 존재하는 경우 /image/files/small/518.jpgnginx는 요청을 앱에 전달하는 대신 직접 제공해야 합니다.
  4. 그렇지 않은 경우(이미지가 존재하지 않는 경우) nginx는 다시 작성(또는 리디렉션)하고 다음과 같은 맞춤 URI를 통해 앱에 요청을 전달해야 합니다./thumbnail/process/?size=small&model=866
  5. 또한 ngnix는 이미지 요청이 아닌 경우 다른 요청을 수락해서는 안 되며 즉시 444를 반환해야 합니다.

그래서 저는 nginx에 대한 사용자 정의 규칙을 작성하여 이러한 문제를 해결하려고 시도했지만 작동하지 않습니다. 이미 처리된 이미지에는 문제가 없지만 요청을 애플리케이션에 전달하는 대신 404 찾을 수 없음 응답을 생성합니다.

이 구성의 문제점과 내가 놓친 요점이 무엇인지 찾을 수 없습니다.

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

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;

관련 정보