我有很多静态文件,其名称遵循以下模式:
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;
}
这里我要强调两点:
map
必须位于任何server
块之外,并且对于所有 nginx 配置来说都是全局的。- 我们必须在使用 之前定义命名变量
$ext_lower
,因为一旦使用它,它就会因为使用正则表达式而破坏所有位置变量($1
、 、...)。所以不会起作用,因为-将为空。$2
alias /path_to_directory/$4/$3/$2/$1.$ext_lower;
$1
$4