ASP.NET Core使用靜態文件、目錄遊覽與MIME類型管理

前言

今天咱們來了解了解ASP.NET Core中的靜態文件的處理方式.緩存

之前咱們寄宿在IIS中的時候,不少靜態文件的過濾 和相關的安全措施 都已經幫咱們處理好了.安全

ASP.NET Core則不一樣,由於是跨平臺的,解耦了IIS,因此這些工做 咱們能夠在管道代碼中處理.服務器

 

正文

在咱們的Web程序開發中,確定要提供不少的靜態文件(好比:JS,CSS)給客戶端下載使用.因此咱們先來看看ASP.NET Core中是怎麼處理的.app

當咱們建立一個ASP.NET Core MVC的模版程序後,會發現它與傳統的文件結構仍是會有區別.asp.net

多了一個wwwroot文件夾,少了不少其餘的資源文件夾.如圖:ide

咱們點進去,就能夠看到,微軟的模版,已經把全部的資源文件全放到了這裏面,如圖:svg

這樣,項目就乾淨了許多,下面,咱們就來說講這個資源根目錄spa

1.提供靜態文件

咱們到模版的Startup管道配置中,能夠看到,注入相關靜態資源的代碼,已經幫咱們寫好了,如圖:.net

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

訪問資源的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.

 

 

寫在最後

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

相關文章
相關標籤/搜索