奇妙な nginx 設定: 複数の書き換えルールが機能しない

奇妙な nginx 設定: 複数の書き換えルールが機能しない

特殊なイメージを準備する方法を知っているアプリケーションがあり、それを別のマシンで実行しています (イメージ サーバーとして使用しようとしています)。

これらの画像がアプリケーションによって準備され提供されると、/image/files/medium/562.jpg などのパブリックにアクセス可能なパスに物理的に保存され、それ以降のリクエストでアプリケーションが何度も実行されるのを防ぎます。

私のアプリケーションはフロント コントローラー パターンを実装しているので、アプリにリクエストを送信する必要があり/thumbnail/process/?qs=1&qs=2ます/thumbnail.php

また、実際のサムネイル プロセッサの URL をエンド ユーザーから隠す必要があります。

この時点での流れは以下のようになります。

  1. エンドユーザーが次のような画像リクエストを行う/picture/small/518.jpg
  2. /image/files/small/518.jpg実際にはフォルダーが存在しないため、Nginx がそれをキャッチして書き換えますpicture
  3. 存在する場合/image/files/small/518.jpg、nginx はリクエストをアプリに渡すのではなく、それを直接処理する必要があります。
  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;

関連情報