公司項目逐漸增多,對效率的要求越來越高,不同項目分部不同服務器,最初想用nginx 就是為了多個項目用一個url和服務器宕機解決方案
nginx也可作為附件服務器,畢竟nginx也對靜態文件支持較好,我們主要文件下載就通過url地址直接訪問(這里就不介紹安全性的問題了),
直接訪問問題就來了,各大瀏覽器都針對,圖片 txt,pdf,都是直接打開的,
解決思路就是,告訴瀏覽器這個文件需要下載而不是直接打開
nginx通過反向代理可以直接過濾訪問的url在指定的訪問添加heard
1,下載:
直接上代碼
server {
#監聽的端口
listen 80;
server_name localhost;
location / {
root html;
if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx|jpg|png)$){
add_header Content-Disposition attachment;
}
index index.html index.htm;
}
紅色代碼是關鍵,$request_filename 是nginx變量文件名稱,正則表達式,是匹配已.所需文件類型,這樣就在響應中告訴瀏覽器可以下載了
在網上找到的資料都是 add_header : Content-Disposition attachment;
重點注意多了一個':'符號,這個符號在火狐,360等一系列瀏覽器都沒問題的,但在谷歌瀏覽器就是沒法下載,而直接打開,網上找了很多資料都沒有nginx關於谷歌瀏覽器不能下載的問題最后自己調試發現
谷歌把:號也添加進去了,也不能所網上其他人發的方案誤導人或許沒有測試過谷歌瀏覽器也可能是瀏覽器版本問題
總之如果任何瀏覽器出現不下載直接打開的時候,自己調試一下響應頭.
2,預覽:
因為項目需要下載和預覽,下載時能下載了但是預覽也都變成下載了,這個有點悲催,似乎兩個不能同時存在.
預覽的思路還是和下載一樣告訴瀏覽器我要預覽這文件不許下載.
因為對nginx,不熟走了很多彎路,這里就不訴苦了.
這里用到$request_uri,這個變量是訪問的url地址,獲取到url地址那么我們就可以在url上添加參數來辨別我是預覽文件
代碼:
server {
#監聽的端口
listen 80;
server_name localhost;
location / {
root html;
set $flag 0;
if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx|jpg|png)$){
set $flag 1;
}
#如果帶有view說明是預覽
if ($request_uri ~* view$){
set $flag 2;
}
if ($flag = 1){
add_header Content-Disposition: attachment;
}
index index.html index.htm;
}
這里$flag nginx自定義的一個變量,為什么要兩個if來判斷,這里也就不解釋了
這樣在預覽的url上添加一個以view結尾的參數就可以實現預覽功能了.
結尾:這個也是初探nginx,寫下這些,做個備忘錄,也希望也需要的朋友,可以作為借鑒,如果過有更好的方案希望大神分享!!!!