我有配置
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 {
...
}
}