Nginx

Nginx 位置匹配多個副檔名,除非路徑以特定單詞開頭

  • December 17, 2018

如何編寫與以以下副檔名結尾的任何路徑匹配的位置塊:

jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html

除非路徑以“/rails”開頭(例如:/rails/randomstring/image.png)?

我目前有這個基本塊:

location ~* \.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
 gzip_static on;
 gzip on;
 expires max;
 add_header Cache-Control public;
}

但這將匹配“/rails/randomstring/image.png”,我不希望這樣。

您可以使用location ^~定義,例如:

location ^~ /rails/ {
   # your directives for "/rails/..." URIs here
}

location ~* \.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
   gzip_static on;
   gzip on;
   expires max;
   add_header Cache-Control public;
}

根據文件

如果最長匹配前綴位置具有“^~”修飾符,則不檢查正則表達式。

更新

在不聲明額外塊的情況下執行此操作的另一種方法location是使用負正則表達式斷言:

location ~ ^(?!/rails/).*\.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
   gzip_static on;
   gzip on;
   expires max;
   add_header Cache-Control public;
}

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