我的伺服器上有以下資料夾層次結構:
/var/images/d/d8/d82fa6c3eed/image.png
目錄結構是根據 MD5 雜湊值建立的,並分為子資料夾。
我想使用 Nginx 向網路使用者提供圖像,但不想公開目錄結構。例如,我做不是想要像這樣提供文件:
http://domain.tld/d/d8/d82fa6c3eed/image.png
我想提供類似的服務:
http://domain.tld/b/4324re3fg34f6td/image.png
我也使用 nginxsecure link
模組,但是你必須指定獲取圖像的目錄,如下所示:
http://domain.tld/b/<secure link MD5 hash>/path/to/file.png
被重寫為:
http://domain.tld/images/path/to/file.png?md5=<secure link md5>
我不想指定檔案系統上的實際特定目錄路徑來取得該檔案。我的想法如下:
- 客戶端可以傳送某種代表檔案目錄路徑的MD5值,NGINX將每N個字元插入/。這可能嗎?
- 發送以 base64 編碼的目錄路徑,讓 NGINX 對其進行解碼並在內部重定向到那裡。和這個?
- 也許為此使用一個額外的模組,例如 openresty 模組?
我能實現這個目標嗎..?
我的 nginx 設定:
server {
..
root /var/www/html;
..
location /b/ {
rewrite ^/b/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.*)$ /images/$2/$3?md5=$1 last;
}
location /images/ {
internal;
secure_link $arg_md5;
secure_link_md5 '$uri mysecretkey';
if($secure_link = "") { return 404; }
if($secure_link = "0") { return 410; }
}
}
答案1
我沒有使用過secure_link
,所以我無法評論你提案的那部分。但配置中的一個明顯錯誤是rewrite...last
,如果您希望區塊處理重寫的 URI,則應該使用location /images/
。後綴break
導致 URI 在同一位置進行處理。
看這個文件了解詳情。