Nginx權(quán)限控制文件的預(yù)覽和下載方式
基于 Nginx + Java(SpringBoot) 實(shí)現(xiàn)帶權(quán)限驗(yàn)證的靜態(tài)文件服務(wù)器,支持文件下載、PDF預(yù)覽和圖片預(yù)覽。
需要注意的是,無(wú)需權(quán)限判斷的圖片不建議使用此方法,大量的圖片訪問(wèn)會(huì)增加后臺(tái)服務(wù)器的處理壓力。
實(shí)現(xiàn)原理
本質(zhì)上是使用了X-Sendfile功能來(lái)實(shí)現(xiàn),X-Sendfile 是一種將文件下載請(qǐng)求重定向到Web 服務(wù)器處理的機(jī)制,該Web服務(wù)器只需負(fù)責(zé)處理請(qǐng)求(例如權(quán)限驗(yàn)證),而無(wú)需執(zhí)行讀取文件并發(fā)送給用戶的任務(wù)。
X-Sendfile可顯著提高后臺(tái)服務(wù)器的性能,消除了后端程序既要讀文件又要處理發(fā)送的壓力,尤其是處理大文件下載的情形下!
Nginx也具有此功能,但實(shí)現(xiàn)方式略有不同。
在Nginx中,此功能稱為X-Accel-Redirect。
用戶請(qǐng)求文件,權(quán)限控制時(shí)序圖

實(shí)現(xiàn)步驟
1、靜態(tài)文件通過(guò)file_server訪問(wèn),會(huì)被設(shè)置為internal,即只能內(nèi)部訪問(wèn)不允許外部直接訪問(wèn)。
# 文件下載服務(wù)
location ^~ /file_server {
# 內(nèi)部請(qǐng)求(即一次請(qǐng)求的Nginx內(nèi)部請(qǐng)求),禁止外部訪問(wèn),重要。
internal;
# 文件路徑
alias /home/file/;
limit_rate 200k;
# 瀏覽器訪問(wèn)返回200,然后轉(zhuǎn)由后臺(tái)處理
error_page 404 =200 @backend;
}2、所有靜態(tài)資源請(qǐng)求均被重定向到Java后臺(tái),經(jīng)過(guò)權(quán)限驗(yàn)證后才能訪問(wèn)。
# 文件下載鑒權(quán)
location @backend {
# 去掉訪問(wèn)路徑中的 /file_server/,然后定義新的請(qǐng)求地址。
rewrite ^/file_server/(.*)$ /uecom/attach/$1 break;
# 這里的url后面不可以再拼接地址
# 定義后臺(tái)鑒權(quán)服務(wù)
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 后臺(tái)權(quán)限驗(yàn)證
用戶請(qǐng)求只需要傳遞附件參數(shù)和身份token,不再需要傳遞服務(wù)器的真實(shí)路徑。
例如:
http://127.0.0.1:9222/file_server/img_file?id=123456&token=**********
權(quán)限校驗(yàn)完成,返回設(shè)置文件請(qǐng)求路徑
response.setHeader("X-Accel-Redirect", "/file_server" + attach.getAttachPath());重點(diǎn)是X-Accel-Redirect配置返回服務(wù)器文件的真實(shí)路徑,該路徑返回后由Nginx內(nèi)部請(qǐng)求處理,不會(huì)暴露給請(qǐng)求用戶。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx結(jié)合keepalived實(shí)現(xiàn)高可用的完整步驟
這篇文章主要給大家介紹了關(guān)于nginx結(jié)合keepalived實(shí)現(xiàn)高可用的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Apache select和Nginx epoll模型的用法對(duì)比
這篇文章主要介紹了Apache select和Nginx epoll模型的用法對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
Nginx實(shí)現(xiàn)Nacos反向代理的項(xiàng)目實(shí)踐
在日常的web網(wǎng)站部署中,經(jīng)常會(huì)用到nginx反向代理,本文主要介紹了Nginx實(shí)現(xiàn)Nacos反向代理的項(xiàng)目實(shí)踐,Nginx實(shí)現(xiàn)Nacos反向代理的項(xiàng)目實(shí)踐2022-03-03
Nginx配置實(shí)現(xiàn)用IP灰度測(cè)試(不同用戶ID)
本文主要介紹了使用Nginx配置實(shí)現(xiàn)基于IP的灰度發(fā)布實(shí)驗(yàn),以及如何通過(guò)不同用戶ID測(cè)試灰度發(fā)布,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
nginx外網(wǎng)訪問(wèn)內(nèi)網(wǎng)站點(diǎn)配置操作
這篇文章主要介紹了nginx外網(wǎng)訪問(wèn)內(nèi)網(wǎng)站點(diǎn)配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

