ASP.NET Core使用靜態檔案、目錄遊覽與MIME型別管理

weixin_34337265發表於2018-01-05
前言

今天我們來了解了解ASP.NET Core中的靜態檔案的處理方式.

以前我們寄宿在IIS中的時候,很多靜態檔案的過濾 和相關的安全措施 都已經幫我們處理好了.

ASP.NET Core則不同,因為是跨平臺的,解耦了IIS,所以這些工作 我們可以在管道程式碼中處理.

 

正文

在我們的Web程式開發中,肯定要提供很多的靜態檔案(比如:JS,CSS)給客戶端下載使用.所以我們先來看看ASP.NET Core中是怎麼處理的.

當我們建立一個ASP.NET Core MVC的模版程式後,會發現它與傳統的檔案結構還是會有區別.

多了一個wwwroot資料夾,少了很多其他的資原始檔夾.如圖:

我們點進去,就可以看到,微軟的模版,已經把所有的資原始檔全放到了這裡面,如圖:

這樣,專案就乾淨了許多,下面,我們就來講講這個資源根目錄

1.提供靜態檔案

我們到模版的Startup管道配置中,可以看到,注入相關靜態資源的程式碼,已經幫我們寫好了,如圖:

這句話就是注入靜態資源用的,預設會將wwwroot的資源直接配置的和根目錄一樣,來方便訪問.

訪問資源的URL類似: "http://localhost:9189/images/banner3.svg" 這樣.

那麼問題來了,我們能不能自己配置這個靜態資源呢?.

當然是可以的~.

我們在專案中建立資料夾如下:

 

然後通過StaticFileOptions注入靜態資源的配置,程式碼如下:

            app.UseStaticFiles(new StaticFileOptions()
            {
                FileProvider = new PhysicalFileProvider(
                Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),
                RequestPath = new PathString("/StaticFiles")
            });

注意:這裡的2個StaticFiles, 第一個是你的本地資源路徑,第二個是你需要配置的URL路徑,URL路徑可以自己定義,這樣可以一定程度上保護自己的資源安全.

然後我們通過URL訪問效果如下:

StaticFileOptions中,我們還可以通過OnPrepareResponse屬性配置我們的響應頭,新增 程式碼如下:

            app.UseStaticFiles(new StaticFileOptions()
            {
                FileProvider = new PhysicalFileProvider(
                Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),
                RequestPath = new PathString("/StaticFiles"),
                OnPrepareResponse = ctx =>
                {
                    ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");
                }
            });

 這裡,我們設定http響應快取為600秒.

(小知識:max-age:表示當訪問此網頁後的max-age秒內再次訪問不會去伺服器請求,其功能與Expires類似,只是Expires是根據某個特定日期值做比較。一但快取者自身的時間不準確.則結果可能就是錯誤的,而max-age,顯然無此問題.。Max-age的優先順序也是高於Expires的。)

效果如下:

這樣,我們就可以根據需求來配置自己的靜態檔案快取和其他的響應頭資訊.

2.啟用靜態檔案目錄瀏覽

開啟靜態檔案目錄瀏覽..其實是一件安全性級低的事情,不管是傳統的asp.net還是asp.net core 預設都是關閉了這個功能.

但是,不排除我們會用到.在asp.net中,我們只需要的Web.config中配置即可.

下面我們就來講講如何在asp.net core 中啟用我們的靜態檔案目錄遊覽

開啟靜態檔案目錄遊覽需要使用UseDirectoryBrowser來注入配置,程式碼如下:

            app.UseDirectoryBrowser(new DirectoryBrowserOptions()
            {
                FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),
                RequestPath = new PathString("/MyStaticFiles")
            });

這裡,我特意改了URL的訪問路徑.為MyStaticFiles..我們來看看效果:

我們點選裡面任意一個檔案,會發現.返回404.因為路徑是

所以,這裡需要和上面的檔案URL路徑一致,才可以訪問的到檔案.(這樣其實提供了一種比較安全的配置手段.可以隱藏自己本機的真實路徑)

 

3.使用UseFileServer合成的注入方法~簡化程式碼.

按照我們上面的配置,如果開啟了檔案和目錄遊覽,就會發現寫了不少注入程式碼,如下:

這樣不是很方便,也不利於後期的維護.那麼,下面我們就來簡化他~

 

UseFileServer的功能結合了UseStaticFilesUseDefaultFilesUseDirectoryBrowser

我們把上面的程式碼全部註釋.並修改程式碼如下:

app.UseFileServer(new FileServerOptions()
            {
                FileProvider = new PhysicalFileProvider(
                Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),
                RequestPath = new PathString("/StaticFiles"),
                EnableDirectoryBrowsing = true
            });

效果如下:

 

這裡,注意EnableDirectoryBrowsing屬性,就是是否啟用目錄的屬性.

 

4.ASP.NET Core中使用MIME內容型別來過濾靜態檔案返回.

上篇文章我們提到過.需要使用

FileExtensionContentTypeProvider

這個類.具體使用方法,直接new一個即可,裡面包含了300多種已知的檔案型別,如下:

為什麼這裡我們要提到這個呢.因為他可以幫我們過濾一些不想讓客戶端訪問的檔案型別.如下:

這裡要注意,使用FileExtensionContentTypeProvider,只能通過UseStaticFiles,不能使用UseFileServer

因為ContentTypeProvider是StaticFileOptions(靜態檔案選項)的配置內容,在FileServerOptions中並沒有.

上面的程式碼,我們刪除了png格式檔案.也就是不返回這個內容的檔案.執行後效果如下:

我們訪問我們的gif格式的檔案,效果如下:

還是可以正常訪問的.對於一些安全性較高,或者涉及檔案型別較多的功能來說.還是比較實用的.可以自己過濾掉一些敏感型別.比如exe.

 

 

寫在最後

好了,本篇到此就結束了~歡迎大家批評指正~喜歡或者覺得有用的話 就關注一下 點個推薦..謝謝~

相關文章