Nginx配置實(shí)現(xiàn)下載文件的示例代碼
偶爾聽(tīng)人說(shuō)用nginx實(shí)現(xiàn)文件上傳下載,之前看nginx實(shí)踐大致看到過(guò),沒(méi)有細(xì)究。所以今天就想研究下nginx實(shí)現(xiàn)文件的上傳下載,直接開(kāi)搞,本地服務(wù)啟起。這里記錄下配置及踩坑記錄。
一、配置
http { ... server: { # 配置下載 location /download { root D:\\download; autoindex on; autoindex_exact_size off; } } ... }
這是目錄里隨便放的幾個(gè)文件,可以看到實(shí)現(xiàn)成功。
這里踩過(guò)幾個(gè)坑,下面提示下:
1、root路徑配置問(wèn)題
剛開(kāi)始配置的 alias D:\download,報(bào)錯(cuò):2020/08/14 10:36:06 [emerg] 26396#16140: invalid number of arguments in "alias" directive in D:\Program File\nginx\nginx-1.13.12/conf/nginx.conf:74
那么查配置 74 行,發(fā)現(xiàn)少了分號(hào),加上問(wèn)題依舊。換成 root D:\download;,報(bào)錯(cuò):2020/08/14 10:44:20 [emerg] 21376#17156: invalid number of arguments in "root" directive in D:\Program File\nginx\nginx-1.13.12/conf/nginx.conf:74
問(wèn)題依舊,后來(lái)發(fā)現(xiàn)路徑有問(wèn)題,寫(xiě)錯(cuò)了,應(yīng)該是
root D:/download; // 或者 root D:\\download;
原因都懂,就是 \ 只是個(gè)轉(zhuǎn)義字符,要么用 \\,要么就用 /
2、root與alias差別
ok,這樣配置可以了。但是當(dāng)我輸入:http://localhost/download/,報(bào)錯(cuò)404,我的D盤(pán)目錄下為D:/download/*,然后其他文件
剛開(kāi)始報(bào)錯(cuò):2020/08/14 11:02:49 [error] 9928#12876: *11 CreateFile() "D:\download\/download" failed (2: The system cannot find the file specified), client: 127.0.0.1, server: , request: "GET /download HTTP/1.1", host: "localhost"
看到這個(gè)路徑D:\download\/download這里有問(wèn)題,所以我把配置rootD:/download/;,后面的 / 去掉了,再試,還是報(bào)錯(cuò):2020/08/14 11:04:15 [error] 3128#11636: *1 CreateFile() "D:\download/download" failed (2: The system cannot find the file specified), client: 127.0.0.1, server: , request: "GET /download HTTP/1.1", host: "localhost"
所以考慮到不是路徑的問(wèn)題,那么問(wèn)題原因在哪?在于 root 與 alias 配置的區(qū)別。
也就是說(shuō) 當(dāng) rootD:/download; 時(shí),你請(qǐng)求http://localhost/download/,他找的是:D:\download\download
而當(dāng) alias D:/download; 時(shí),你請(qǐng)求http://localhost/download/,他找的才是:D:\download
那么我把我的本地路徑改一下:D:/download/download/*,然后再是其他文件,那么就成功了。
3、中文文件問(wèn)題
還有坑,點(diǎn)擊全英文名文件是正常預(yù)覽下載的,中文名文件報(bào)錯(cuò)。在 server段中添加 charset utf-8; 也不行,或者 charset gbk,utf-8;
也不行。有清楚的,煩請(qǐng)不吝賜教,謝謝。
思考良久,應(yīng)該不是nginx配置的問(wèn)題了,因?yàn)楹芏嗟胤蕉颊f(shuō)這樣配置就可以顯示中文了。然后我想到會(huì)不會(huì)是系統(tǒng)編碼問(wèn)題呢?我用本地做服務(wù)器。使用chcp命令查了一下系統(tǒng)編碼,顯示936。一般正常能顯示中文的是936,那說(shuō)明沒(méi)問(wèn)題。
雖然中文顯示是正常的,但是**的,一點(diǎn)還是報(bào)錯(cuò),亂碼或者404。沒(méi)辦法直接點(diǎn)擊下載中文名文件,或者瀏覽中文名目錄。
中文名文件下載可以通過(guò) 復(fù)制文件名,然后貼在瀏覽器url后面,就可以下載下來(lái)了,中文名目錄是真的無(wú)法瀏覽?。?!
原因是,windows服務(wù)器中文是gbk編碼,nginx的這種頁(yè)面的href就是用gbk進(jìn)行urlencode的,然后一般瀏覽器都是使用utf-8的,當(dāng)然就沒(méi)法訪問(wèn)了。
4、想防止瀏覽器自動(dòng)打開(kāi)文件而不是下載文件,添加
add_header Content-Disposition "attachment;";
// 所有文件都不打開(kāi) location / { add_header Content-Disposition "attachment;filename*=utf-8'zh_cn'$arg_n"; }
一般存儲(chǔ)在服務(wù)器上的文件都不會(huì)用原來(lái)的名字,所以下載的時(shí)候需要改名,可通過(guò)url中添加參數(shù),然后在nginx中根據(jù)參數(shù)來(lái)改名。
舉例:參數(shù)為 n=xxx.jpg
url:https"http://xxxxx?n=xxx.jpg //表示把下載下來(lái)的文件名字改為xxx.jpg
nginx需要配置成
location / { if ($request_uri ~* ^.*\?n=([^&]+)$) { add_header Content-Disposition "filename*=$arg_n"; } }
注釋?zhuān)豪锩娴膗tf-8是有些瀏覽器會(huì)自動(dòng)把文件改成urlencode的格式
一般1,2都是要一起配置的
location / { if ($request_uri ~* ^.*\?n=([^&]+)$) { add_header Content-Disposition "attachment;filename*=$arg_n"; } }
到此這篇關(guān)于Nginx配置實(shí)現(xiàn)下載文件的示例代碼的文章就介紹到這了,更多相關(guān)Nginx 下載文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Nginx中accept鎖的機(jī)制與實(shí)現(xiàn)詳解
- 解決Nginx 配置 proxy_pass 后 返回404問(wèn)題
- Nginx配置SSL證書(shū)出錯(cuò)解決方案
- Nginx 502 Bad Gateway錯(cuò)誤原因及解決方案
- nginx location中多個(gè)if里面proxy_pass的方法
- nginx 多個(gè)location轉(zhuǎn)發(fā)任意請(qǐng)求或訪問(wèn)靜態(tài)資源文件的實(shí)現(xiàn)
- 查看nginx配置文件路徑和資源文件路徑的方法
- 詳解nginx進(jìn)程鎖的實(shí)現(xiàn)
相關(guān)文章
ASP.NET WebForm中<%=%>與<%#%>的區(qū)別
這篇文章主要介紹了ASP.NET WebForm中<%=%>與<%#%>的區(qū)別,需要的朋友可以參考下2015-01-01ASP.NET使用gridview獲取當(dāng)前行的索引值
這篇文章主要介紹了ASP.NET使用gridview獲取當(dāng)前行的索引值的方法匯總,有需要的小伙伴可以參考下。2015-06-06ASP.net中Core自定義View查找位置的實(shí)例代碼
在本篇文章里小編給大家分享的是關(guān)于ASP.net中Core自定義View查找位置的實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2020-04-04Elasticsearch.Net使用入門(mén)教程(1)
這篇文章主要為大家詳細(xì)介紹了Elasticsearch.Net使用入門(mén)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Visual Studio 2017下ASP.NET CORE的TagHelper智能提示解決辦法
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017下ASP.NET CORE TagHelper智能提示的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03在.NET?MAUI應(yīng)用中配置應(yīng)用生命周期事件
本文詳細(xì)講解了在.NET?MAUI應(yīng)用中配置應(yīng)用生命周期事件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03MVC微信網(wǎng)頁(yè)授權(quán)獲取用戶OpenId
這篇文章主要為大家詳細(xì)介紹了MVC微信網(wǎng)頁(yè)授權(quán),在模板頁(yè)中獲取用戶openid,感興趣的小伙伴們可以參考一下2016-09-09.NET Framework攔截HTTP請(qǐng)求的實(shí)現(xiàn)
本文主要介紹了.NET Framework攔截HTTP請(qǐng)求的實(shí)現(xiàn),主要用于記錄 HTTP 信息,調(diào)試程序、分析程序性能等方面,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03