Nginx

Nginx 位置配置

  • May 1, 2022

我有配置

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將完全相同,有沒有辦法將它們組合起來,或者我應該只製作兩個相同的塊?

作為一種解決方法,您可以縮短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 {
       ...
   }
}

引用自:https://serverfault.com/questions/1094355