try_files 不使用来自正则表达式和 map 的变量

try_files 不使用来自正则表达式和 map 的变量

我正在尝试有条件地向支持的客户端提供 .webp 图像。图像存储在同一个文件夹中image.jpgimage.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

相关内容