0

我最近切换到 nginx 并且对它还很陌生,所以如果之前已经广泛介绍过,请原谅我。

我试图做的是根据发出的接受标头重写用户请求。

特别是:如果 accpet 标头是 image/gif 或 image/webp 则提供图像,如果不是连接 .gif 并提供该 url。

听到我的 apache 配置,但我现在再次使用 nginx 并尝试学习如何将其转换:

RewriteCond %{HTTP_ACCEPT} ^image/gif [NC] 
RewriteCond %{HTTP_ACCEPT} ^image/webp [NC] 
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com(.*)$ [NC]
RewriteRule ^i/(.*)\.gif http://example.com/i/$1 [R=302,L]

正如你所看到的,上面的 htaccess 文件就像一个魅力,但 nginx 看起来完全不同。

我做了一些阅读并想出了这个:

map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

在服务器块内包含以下内容

location ~* ^/i/.+\.(gif)$ {
      root /storage-pool/example.com/public;
      add_header Vary Accept;
      try_files $uri$webp_suffix $uri =404;
}

可悲的是,这不起作用,我仍然不知道如何在 nginx 中进行故障排除。

任何信息将不胜感激,谢谢。

4

1 回答 1

0

从您的位置,try_files将连接$uri可能$webp_suffix不是您想要的,例如,如果您有请求将/i/test.gifHTTP_ACCEPT头设置为image/webp上面的位置配置,则会尝试在以下位置查找文件:

/storage-pool/example.com/public/i/test.gif.webp

你可能想要下面这样的东西:

location ~* ^(?P<basename>/i/.+)\.gif$ {
    root /storage-pool/example.com/public;
    add_header Vary Accept;
    try_files $basename$webp_suffix $uri =404;
}

此位置将捕获不带.gif后缀的图像路径,并将作为变量命名$basename

有关命名捕获的更多信息:http: //nginx.org/en/docs/http/server_names.html#regex_names

于 2014-03-30T15:16:53.057 回答