這個系列的初衷是便於本身總結與回顧,把筆記本上面的東西轉移到這裏,態度不禁得謹慎許多,下面是我參考的資源:css
官方文檔緩存
記在這裏的東西我會不斷的完善豐滿,對於文章裏面一些侷限於我本身知識積累的觀點,但願沒有跳走堅持看完的朋友,可以予以指正和鼓勵.安全
(1)Starup服務器
(2)中間件網絡
(3)靜態文件mvc
在上節中間件一節咱們提到:靜態文件中間件能夠處理對靜態文件的請求,並讓管道的其他部分短路,從而起到終端中間件的做用app
這一節咱們對靜態文件作一個更深刻的瞭解. 以一個新建的.Net core Web項目(有視圖模型控制器的模版)爲例ide
應用的Web主機必須識別內容根目錄。測試
項目Program.cs內容以下, 採用WebHost.CreateDefaultBuilder方法可將內容根目錄設置爲當前目錄:
1 public class Program 2 { 3 public static void Main(string[] args) 4 { 5 CreateWebHostBuilder(args).Build().Run(); 6 } 7 8 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 9 WebHost.CreateDefaultBuilder(args) 10 .UseStartup<Startup>(); 11 }
靜態文件存儲在項目的Web根目錄中。 默認目錄是 <content_root>/wwwroot,因此在項目wwwroot下面咱們看到了以下結構
可是僅僅將內容根目錄設置爲當前目錄還不行,咱們還得在Starup啓動類的Configure方法下添加靜態文件中間件組件才行,
1 public void Configure(IApplicationBuilder app) 2 { 3 app.UseStaticFiles();
4 }
這樣wwwroot目錄下的組員文件才能被訪問,例如引用css文件
<link rel="stylesheet" href="~/css/site.css" />
假設咱們把上述的UseStaticFiles方法註釋掉,咱們啓動項目後就會發現頁面的樣式徹底發生變化,那是由於在wwwroot裏面的樣式文件被禁止訪問了
上面說到靜態文件默認的目錄是 <content_root>/wwwroot,若是想換成別的命名,例如:<content_root>/staticroot,該如何操做呢?
1 public class Program 2 { 3 public static void Main(string[] args) 4 { 5 CreateWebHostBuilder(args).Build().Run(); 6 } 7 8 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 9 WebHost.CreateDefaultBuilder(args) 10 //當前目錄下的staticroot文件夾 11 .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "staticroot")) 12 .UseStartup<Startup>(); 13 }
這樣這樣靜態文件的默認目錄由 <content_root>/wwwroot變爲<content_root>/staticroot,若是不將項目的靜態資源轉移到<content_root>/staticroot下,那麼項目中的靜態資源將沒法被訪問
若是咱們使用默認設置,那麼靜態文件的訪問都是跳到了wwwroot下,這個時候問題就出現了,,假設有以下的目錄結構
怎麼設置可以使得同級目錄也可以被訪問,好比既可以訪問<content_root>/wwwroot/img/header.jpg,又可以訪問<content_root>/MyStaticFiles/images/header.jpg
這時候就須要有參數的UseStaticFiles方法,經過StaticFileOptions對象來解決
1 public void Configure(IApplicationBuilder app) 2 { 3 // For the wwwroot folder 4 app.UseStaticFiles(); 5 // For the /MyStaticFiles url 6 app.UseStaticFiles(new StaticFileOptions 7 { 8 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), 9 RequestPath = "/MyStaticFiles" 10 }); 11 }
這樣設置,2個同級目錄就均可以訪問了
在靜態文件中間件組件中,上述的StaticFileOptions 對象還可用於設置 HTTP 響應標頭。
舉例而言,如下代碼除了配置從 Web 根目錄提供靜態文件外,還設置 Cache-Control 標頭:
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2 { 3 var cachePeriod = env.IsDevelopment() ? "600" : "604800"; 4 app.UseStaticFiles(new StaticFileOptions 5 { 6 OnPrepareResponse = ctx => 7 { 8 // Requires the following import: 9 // using Microsoft.AspNetCore.Http; 10 ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}"); 11 } 12 }); 13 }
靜態文件模塊並不提供受權檢查。在上面設置wwwroot能夠訪問後, wwwroot 下的全部文件都是公開的
因此爲了給文件提供受權,你須要有以下的操做:
1將文件保存在 wwwroot 和靜態文件中間件能夠訪問到的任何目錄以外
2經過一個控制器的 Action 來訪問它們,經過受權後返回 FileResult
1 [Authorize] 2 public IActionResult BannerImage() 3 { 4 var file = Path.Combine(Directory.GetCurrentDirectory(), 5 "MyStaticFiles", "images", "header.jpg"); 6 return PhysicalFile(file, "image/jpg+xml"); 7 }
這樣,只有經過了身份認證纔可以獲得文件信息
目錄瀏覽容許網站用戶看到指定目錄下的目錄和文件列表。
可是基於安全考慮,默認狀況下是禁用目錄訪問功能的。
在 Startup.Configure 中調用 UseDirectoryBrowser 擴展方法能夠開啓網絡應用目錄瀏覽:
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2 { 3 app.UseDirectoryBrowser(new DirectoryBrowserOptions 4 { 5 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")), 6 RequestPath = "/Browser" 7 }); 8 }
訪問 <content_root>/Browser後效果以下
官方文檔說明:還須要調用 Startup.ConfigureServices 中的AddDirectoryBrowser 方法,以下
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddDirectoryBrowser(); 4 }
可是我測試的時候沒有註冊這個服務,仍然能夠啓用目錄,你們在用到或者測試的時候可用留意一下
設置默認首頁能給你的站點的每一個訪問者提供一個起始頁。使站點能提供默認頁,避免用戶輸入完整 URI.
輸入如下代碼
1 public void Configure(IApplicationBuilder app) 2 { 3 app.UseDefaultFiles(); 4 app.UseStaticFiles(); 5 }
項目啓動後,會在指定的目錄(未設置則在wwwroot下)按以下順序搜索文件,來做爲網站的起始頁
對於所用示例mvc項目來講,項目啓動後,由於路由的原故,路徑自動跳轉到/home/index下,若是設置了提供默認文檔,那麼會按照下面的狀況(通常而言靜態文件中間件會放在前面,具體狀況仍是以中間件添加順序爲準)
路徑 | 實際訪問 |
http://localhost:xxx | wwwroot下default.html |
http://localhost:xxx/home | home控制器index方法 |
http://localhost:xxx/home/Idex | home控制器index方法 |
1 public void Configure(IApplicationBuilder app) 2 { 3 // Serve my app-specific default file, if present. 4 DefaultFilesOptions options = new DefaultFilesOptions(); 5 options.DefaultFileNames.Clear(); 6 options.DefaultFileNames.Add("index.html"); 7 app.UseDefaultFiles(options); 8 app.UseStaticFiles(); 9 }
這樣就變成了直接查找index.html,可是若是未找到index.html,那麼會直接404找不到頁面,而不會存在原來的查找順序
1 public void Configure(IApplicationBuilder app) 2 { 3 app.UseFileServer(new FileServerOptions 4 { 5 FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), 6 RequestPath = "/MyStaticFIles", 7 EnableDirectoryBrowsing = true 8 }); 9 }
訪問<content_root>/MyStaticFIles/會有下面2種狀況:
1/MyStaticFIles文件夾下沒有default.htm,default.html,index.htm,index.html
2/MyStaticFIles文件夾下存在default.htm,default.html,index.htm,index.html一個或多個做爲默認文檔
ASP.NET 靜態文件中間件可以支持超過 400 種已知文件內容類型。
若是用戶請求一個未知的文件類型,靜態文件中間件將返回 HTTP 404(未找到)響應。
若是啓用目錄瀏覽,該文件的連接將會被顯示,但 URI 會返回一個 HTTP 404 錯誤。
1 public void Configure(IApplicationBuilder app) 2 { 3 app.UseStaticFiles(new StaticFileOptions 4 { 5 ServeUnknownFileTypes = true, 6 DefaultContentType = "image/png" 7 }); 8 }
根據上面的代碼,未知內容類型的文件請求將返回一張圖片,而不會返回一個未找到的錯誤。
Warnning
(終)
文檔信息
感謝您的閱讀,若是您以爲閱讀本文對您有幫助,請點一下「推薦」按鈕。本文歡迎各位轉載,可是轉載文章以後必須在文章頁面中給出做者和原文鏈接。