奇怪的nginxconfiguration:多个重写规则不起作用

我有一个应用程序知道如何准备一些特殊的图像,并在另一台机器上运行(我试图把它用作图像服务器)。

当这些图像由应用程序准备并提供时,也可以通过一种可公开访问的path(如/image/files/medium/562.jpg)进行精确保存,以防止在进一步的请求中一次又一次地运行应用程序。

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

另外我需要从最终用户掩盖我真正的缩略图处理器url。

此时stream程如下:

  1. 最终用户发出图片请求,如/picture/small/518.jpg
  2. Nginx捕获它,并重写/image/files/small/518.jpg因为实际上没有picture文件夹。
  3. 如果/image/files/small/518.jpg存在,nginx应该直接服务它,而不是传递请求到应用程序。
  4. 如果它不是(图像不存在),nginx必须重新(或redirect),并通过自定义URI请求传递给应用程序/thumbnail/process/?size=small&model=866
  5. 另外ngnix不应该接受其他请求,如果它不是一个图像请求,并应立即返回444。

所以,我试图通过为nginx编写自定义规则来解决这些问题,但不起作用。 已经处理的图像没有问题,但是它的生成404没有find响应,而不是将请求传递给应用程序。

我找不到这个configuration有什么问题,我错过了什么。

 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;