奇怪的 nginx 設定:多個重寫規則不起作用

奇怪的 nginx 設定:多個重寫規則不起作用

我有一個應用程序,它知道如何準備一些特殊圖像及其在單獨的計算機上運行(我正在嘗試將其用作圖像伺服器)。

當應用程式準備並提供這些圖像時,也會在心理上保存到可公開存取的路徑(例如 /image/files/medium/562.jpg),以防止根據進一步的請求一次又一次地運行應用程式。

我的應用程式實現了前端控制器模式,因此我需要將請求發送到我的應用程序,而/thumbnail/process/?qs=1&qs=2不是/thumbnail.php或類似的東西。

另外,我需要向最終用戶封鎖我的真實縮圖處理器 URL。

此時流程如下:

  1. 最終用戶發出圖像請求,例如/picture/small/518.jpg
  2. Nginx 捕獲它並重寫,/image/files/small/518.jpg因為實際上不存在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;

相關內容