Nginx權限控制文件的預覽和下載方式
基于 Nginx + Java(SpringBoot) 實現帶權限驗證的靜態(tài)文件服務器,支持文件下載、PDF預覽和圖片預覽。
需要注意的是,無需權限判斷的圖片不建議使用此方法,大量的圖片訪問會增加后臺服務器的處理壓力。
實現原理
本質上是使用了X-Sendfile功能來實現,X-Sendfile 是一種將文件下載請求重定向到Web 服務器處理的機制,該Web服務器只需負責處理請求(例如權限驗證),而無需執(zhí)行讀取文件并發(fā)送給用戶的任務。
X-Sendfile可顯著提高后臺服務器的性能,消除了后端程序既要讀文件又要處理發(fā)送的壓力,尤其是處理大文件下載的情形下!
Nginx也具有此功能,但實現方式略有不同。
在Nginx中,此功能稱為X-Accel-Redirect。
用戶請求文件,權限控制時序圖
實現步驟
1、靜態(tài)文件通過file_server訪問,會被設置為internal,即只能內部訪問不允許外部直接訪問。
# 文件下載服務 location ^~ /file_server { # 內部請求(即一次請求的Nginx內部請求),禁止外部訪問,重要。 internal; # 文件路徑 alias /home/file/; limit_rate 200k; # 瀏覽器訪問返回200,然后轉由后臺處理 error_page 404 =200 @backend; }
2、所有靜態(tài)資源請求均被重定向到Java后臺,經過權限驗證后才能訪問。
# 文件下載鑒權 location @backend { # 去掉訪問路徑中的 /file_server/,然后定義新的請求地址。 rewrite ^/file_server/(.*)$ /uecom/attach/$1 break; # 這里的url后面不可以再拼接地址 # 定義后臺鑒權服務 proxy_pass http://192.168.1.101:9999; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
JAVA SpringBoot 后臺權限驗證
用戶請求只需要傳遞附件參數和身份token,不再需要傳遞服務器的真實路徑。
例如:
http://127.0.0.1:9222/file_server/img_file?id=123456&token=**********
權限校驗完成,返回設置文件請求路徑
response.setHeader("X-Accel-Redirect", "/file_server" + attach.getAttachPath());
重點是X-Accel-Redirect配置返回服務器文件的真實路徑,該路徑返回后由Nginx內部請求處理,不會暴露給請求用戶。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于Xen的VPS ubuntu+nginx+php安裝教程
跟蹤vps已經很久了,但是因為需要特殊端口開服務,所以符合條件的多為Xen平臺的vps。眾多比較之后選擇了vpslink在西雅圖機房,速度還不錯。2010-07-07