Nginx 位置配置

Nginx 位置配置

我有配置

location ~ \.(pdf)$ {
    expires 2h;
}

location / {
    ...backend rules...
}

现在我希望第一个块仅针对真正存在的 pdf 执行,否则请求将被传递到后端。我想我应该在第一个位置块中添加try_files $uri @backend

location ~ \.(pdf)$ {
    try_files $uri @backend;
    expires 2h;
}

location / {
    ...backend rules...
}

location @backend {
    ...same backend rules...
}

但事实证明,两个位置/完全相同@backend,有什么办法可以将它们结合起来,还是我应该只制作两个相同的块?

答案1

作为一种解决方法,你可以缩短你location

location / {
    try_files "" @backend;
}

这将为stat每个请求产生一个额外的系统调用,但由于它是您的 Web 根目录stat,所以这些调用应该以某种方式被内核缓存,并且不会对性能造成严重影响。

附言

你不需要为你的正则表达式位置添加捕获组,只要它location ~ \.pdf$ { ... }足够就行了(但性能略有提高)。

更新

还有一个可以减少地点数量的建议:

map $uri $try {
    ~\.pdf$                                 $uri;
    <some_other_mask_to_try_locally_first>  $uri;
    # default value will be an empty string
}
server {
    ...
    location / {
        try_files $try @backend;
    }
    location @backend {
        ...
    }
}

相关内容