在nginx中用X-Accel-Redirect response header控制文件下载
生活随笔
收集整理的這篇文章主要介紹了
在nginx中用X-Accel-Redirect response header控制文件下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
在web應用中,常常會有文件需要下載。如果這些文件是非常私密的,直接用web服務器下載,就不能檢查文件的下載權限。以往遇到這種需要權限的情況,都是用程序語言判定權限后,使用程序語言來讀取文件并輸出,這樣就能解決權限問題。但是使用程序語言來讀取文件又帶來了效率上的問題,如果文件體積比較大或者下載并發數比較大,服務器很快就不堪重負。基于這種情況,web服務器軟件提供了相應的解決辦法:使用一個response header來控制下載。目前squid、apache、lighttpd、nginx等http server都有支持這種方式,但是他們的response header的名字都不一樣:
nginx: X-Accel-Redirect
squid: X-Accelerator-Vary
apache: X-Sendfile
lighttpd: X-Sendfile/X-LIGHTTPD-send-file
用response header控制下載的原理都大同小異:
當客戶端發起請求下載某個文件時,因為并沒有X-Accel-Redirect頭,web服務器并不會立刻就把文件輸出給客戶端;而是將這個請求交給后端的程序語言,程序語言驗證認為該客戶端可以下載這個文件,就寫出相應的X-Accel-Redirect頭并結束處理;X-Accel-Redirect頭返回時經過前端的web服務器,web服務器檢查到這個頭之后,才把文件輸出到客戶端。
那么,如果客戶端偽造一個X-Accel-Redirect頭來讀取呢?當然也是不能下載的,因為web服務器只認識后端發來的X-Accel-Redirect頭,客戶端發來的不算。
于是下面就用nginx來實現上述的這個流程:
1、改變目錄權限,客戶端發起請求時,將這個目錄的請求都交給后端
location /mp3/ { alias /data/html/mp3/; internal; error_page 403 =200 @backend ; } location @backend { proxy_pass http://www.test.com; }
這樣,用戶訪問如http://www.test.com/mp3/1.mp3這樣的地址時,將不能下載文件,nginx會把請求交給后端服務器。
2、在后端服務器配置一個rewrite
rewrite "^/mp3/(.*)\.mp3$" /read_file.do?id=$1 last;
這個rewrite的目的是把請求http://www. test.com/mp3/1.mp3指向到一個php程序語言上,由程序語言處理。
3、寫一個java程序判斷權限
httpResponse.setHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");httpResponse.setHeader("Content-Type","application/octet-stream");httpResponse.setHeader("X-Accel-Redirect","/mp3/"+resource.get("res_url"));//給nginx返回實際文件存在的地址
這樣,配置就完成了。
轉載于:https://my.oschina.net/henrydong/blog/143217
總結
以上是生活随笔為你收集整理的在nginx中用X-Accel-Redirect response header控制文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兔子是怎样吃掉狼的
- 下一篇: 如何区分 B2B、B2C、C2C、C2B