奇怪的 nginx 配置:多个重写规则不起作用

奇怪的 nginx 配置:多个重写规则不起作用

我有一个应用程序知道如何准备一些特殊的图像并且它在单独的机器上运行(我正尝试将其用作图像服务器)。

当应用程序准备好并提供这些图像时,也会在物理上保存到可公开访问的路径中,例如 /image/files/medium/562.jpg,以防止在进一步的请求中一遍又一遍地运行应用程序。

我的应用程序实现了前端控制器模式,所以我需要以/thumbnail/process/?qs=1&qs=2/thumbnail.php或类似的方式向我的应用程序发送请求。

另外,我需要向最终用户隐藏我的真实缩略图处理器网址。

此时流程如下:

  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;

相关内容