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
將完全相同,有沒有辦法將它們組合起來,或者我應該只製作兩個相同的塊?
作為一種解決方法,您可以縮短
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 { ... } }