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.

 

 

写在最后

好了,本篇到此就结束了~欢迎你们批评指正~喜欢或者以为有用的话 就关注一下 点个推荐..谢谢~

相关文章
相关标签/搜索