我正在尝试有条件地向支持的客户端提供 .webp 图像。图像存储在同一个文件夹中image.jpg
。image.jpg.webp
我无法让 try_files 执行我认为它应该执行的操作。当我将其用作$1$webp_suffix
位置时,它会失败,并且不会尝试第二个位置。
在 nginx.conf 中我设置$webp_suffix
如下:
http {
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
include /opt/local/etc/nginx/vhosts/*;
}
但是当我尝试在虚拟主机中使用后缀时出现错误 404。
server {
listen 443 ssl;
server_name my.example.com;
# allow /data/ and /data/343/ as public URL
location ~ ^/data/[0-9/]*(.*)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
# Serve webp images when available and supported
location ~ ^/data/[0-9/]*(.+\.(png|jpg))$ {
add_header Vary Accept;
alias /local/path/httpdocs/data/;
try_files $1$webp_suffix $1 =404;
}
alias /Users/r/Sites/cms/httpdocs/data;
try_files /$1 =404;
}
}
当我删除时$1$webp_suffix
,一切正常,因此路径等看起来是正确的。
答案1
问题是$1
。每次 Nginx 评估正则表达式时,它都会被覆盖。表达式$1$webp_suffix
导致 Nginx 评估map
语句中的正则表达式,这同时导致$1
变成空字符串。
在语句中使用命名捕获location
。
例如:
location ~ ^/data/[0-9/]*(?<filename>.*)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
# Serve webp images when available and supported
location ~ \.(png|jpg)$ {
add_header Vary Accept;
root /local/path/httpdocs/data/;
try_files /$filename$webp_suffix /$filename =404;
}
root /Users/r/Sites/cms/httpdocs/data;
try_files /$filename =404;
}
此外,您应该使用root
而不是alias
。