Nginx - 将$ arg_转换为包含3个子目录的路径,用于try_files

时间:2017-10-19 11:53:17

标签: nginx nginx-location

我目前正在使用 Nginx 处理图像缓存服务器,但是我遇到了让Nginx为缓存图像提供服务的问题

缓存服务器应该能够提供两种图像,首先是相当小的图像,它们几乎不需要图像服务器的干扰。

这是我希望它使用以下配置的方式:

location = /small/ {
  try_files /small/logos/$arg_id.jpg @gen_script;
}
location @gen_script {
  rewrite ^(.*)$ /small/index.php?id=$arg_id;
}

此处没有问题,使用此配置,它会尝试在目录/small/logos中找到一个名称与提供的ID-parameter匹配的图像,如果它不存在则引用{{ 1}},那个会导致@gen_script生成图像。这没有问题。

现在,对于给我带来麻烦的部分,服务器应该提供的第二种图像通常更大并且是基于多个参数创建的{{ 1}}。

这些图像可通过生成的哈希识别,始终为index.php

我想要实现的是将哈希的前三个字符转换为可以找到图像的路径的目录,然后是完整哈希和" .jpg& #34; 。以下是该方面的配置,它不起作用我想出了原因:

(height, width, that sort of thing)

与预期行为相反,128 characters long的每个请求实际上都是由location ~* "^\/image\.php\?hash=(?<a>.{1})(?<b>.{1})(?<c>.{1})(?<d>.{125})(?:.+)$" { try_files /images/$a/$b/$c/$a$b$c$d.jpg @image_gen; } location @image_gen { rewrite ^(.*)$ /image.php$is_args$args; } 接收(或发送到)image.php,再次创建请求的图像,完全与(或任何。 ..)缓存服务器应该

为了澄清,如果哈希值为image.php(可读性缩短),则图像将位于abcde12345。 如何确保/images/a/b/c/abcde12345.jpg检查文件是否存在于预期的子目录结构中,如果它没有将原始请求转发给try_files及其参数,确保生成图像?< / p>

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容

http {

    map $arg_hash $arg_hash_folder {

        default '';
        ~*(.)(.)(.)(.*)$ /$1/$2/$3/$1$2$3$4.jpg;
    }

    server {

        location = /image.php {

            try_files $arg_hash_folder @process_image;
        }

        location @process_image {

            # Try rewrite here and see if it works
            # If it doesn't work then you should have the php processing code here
            # fastcgi_pass ....;
        }
    }
}

地图会给你文件夹路径,如果没有找到process_image将会被调用,在这里你可以尝试重写,我怀疑它会工作,所以你需要包含PHP再次处理代码