Nginx

將圖像請求重寫到 Nginx 中的子目錄結構

  • October 23, 2020

給定這樣的位置:

location ~ ^/user-content/img/) {
 root /srv/foo/bar/uploads/;
 autoindex off;
 access_log off;
 expires 30d;
}

是否可以使用 nginx 請求

/user-content/img/3AF1D3A69CE92ADAED8B0D25C2411595C7C798A5.png

要從目錄中實際提供服務,/srv/foo/bar/uploads/3A/F1/D3這將涉及從請求文件名中獲取前兩個字元並將它們用作第一個子文件夾,然後將字元 3-4 用於下一個更深的文件夾,最後為最後一個子文件夾附加字元 5-6?

你可以試試(未測試)

location /user-content/img/ {
   rewrite "^/user-content/img/(\w{2})(\w{2})(\w{2})(.*)" /$1/$2/$3/$1$2$3$4 break;
   root /srv/foo/bar/uploads;
   autoindex off;
   access_log off;
   expires 30d;
}

更新

只是給它一個測試。可以確認這種方法也有效。正如 OP 所指出的,帶有花括號的正則表達式應該在 nginx 配置中引用。

這種方法應該有效:

location ~ "^/user-content/img/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})(.*)$" {
   root /srv/foo/bar/uploads;
   try_files /$1/$2/$3/$1$2$3$4 =404;
   autoindex off;
   access_log off;
   expires 30d;
}

在這一location行中,我們使用正則表達式將文件名的一部分擷取到四個不同的變數中,前三部分是目錄,第四部分是文件名的其餘部分。

指令中使用變數try_files來創建圖像名稱的路徑。

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