nginx:使用别名时忽略大小写

nginx:使用别名时忽略大小写

我有很多静态文件,其名称遵循以下模式:

sku_(编号)_1.jpg、sku_(编号)_2.jpg、sku_(编号)_3.jpg...

其中 (no) 是一个 6 位数字。由于数量太多,我必须将它们放入不同的目录中,并使用指令alias重定向请求,例如:

location ~* (sku_\d+(\d)(\d)(\d)_\d+)\.(jpg|png|jpeg|gif)$ {
    alias /path_to_directory/$4/$3/$2/$1.$5;
}

现在困难的部分是有时请求带有大写,例如文件请求sku_101138_1.JPG将转到
/path_to_directory/8/3/1/sku_101138_1。JPG
但实际文件存储为
/path_to_directory/8/3/1/sku_101138_1。图片
这将导致404 not found

那么如何告诉 nginx 在使用alias指令时忽略大小写?

答案1

你可以使用地图指示。

# must be defined outside of server block
map $ext   $ext_lower {
    ~*jpg  jpg;
    ~*png  png;
    ~*jpeg jpeg;  
    ~*gif  gif;
}

location ~* (sku_\d+(\d)(\d)(\d)_\d+)\.(jpg|png|jpeg|gif)$ {
    # set named variables
    set $name $4/$3/$2/$1;
    set $ext $5;
    alias /path_to_directory/$name.$ext_lower;
}

这里我要强调两点:

  1. map必须位于任何server块之外,并且对于所有 nginx 配置来说都是全局的。
  2. 我们必须在使用 之前定义命名变量$ext_lower,因为一旦使用它,它就会因为使用正则表达式而破坏所有位置变量( $1、 、...)。所以不会起作用,因为-将为空。$2alias /path_to_directory/$4/$3/$2/$1.$ext_lower;$1$4

相关内容