Asp.net core 學習筆記 ( IIS, static file 性能優化 )

更新 : 2019-05-04 css

補上一個完整的 startup.cs html

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        var fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();
        fileExtensionContentTypeProvider.Mappings[".webmanifest"] = "application/manifest+json";
        services.AddSingleton<IContentTypeProvider>(fileExtensionContentTypeProvider);
        services.Configure<RewriteOptions>(options =>
        {
            options.AddRedirectToWww();
        });
        services.Configure<RewriteOptions>(options =>
        {
            options.AddRedirectToHttps();
        });
        services.AddResponseCompression(options => {
            options.EnableForHttps = true;
        });
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
        app.UseRewriter();
        app.UseResponseCompression();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseStaticFiles(new StaticFileOptions
        {
            ContentTypeProvider = serviceProvider.GetService<IContentTypeProvider>(),
            OnPrepareResponse = ctx =>
            {
                if (!env.IsDevelopment())
                {
                    var cachePeriod = TimeSpan.FromDays(365 * 15).TotalSeconds.ToString();
                    ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
                }
            }
        });
        app.UseMvc();
    }
}
View Code

還有 web config node

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\Project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
      <urlCompression doStaticCompression="false" />
      <modules>
        <remove name="RewriteModule" />
        <remove name="AspNetCoreModule" />
        <remove name="RequestFilteringModule" />
        <remove name="iisnode" />
        <remove name="ProtocolSupportModule" />
        <remove name="IsapiModule" />
        <remove name="IpRestrictionModule" />
        <remove name="IsapiFilterModule" />
        <remove name="HttpRedirectionModule" />
        <remove name="DynamicIpRestrictionModule" />
        <remove name="DirectoryListingModule" />
        <remove name="DefaultDocumentModule" />
        <remove name="CorsModule" />
        <remove name="ConfigurationValidationModule" />
        <remove name="ApplicationInitializationModule" />
        <remove name="WebSocketModule" />
        <remove name="AnonymousIdentification" />
        <remove name="DefaultAuthentication" />
        <remove name="FileAuthorization" />
        <remove name="FormsAuthentication" />
        <remove name="Profile" />
        <remove name="OutputCache" />
        <remove name="UrlAuthorization" />
        <remove name="RoleManager" />
        <remove name="ScriptModule-4.0" />
        <remove name="UrlMappingsModule" />
        <remove name="UrlRoutingModule-4.0" />
        <remove name="WindowsAuthentication" />
        <remove name="Session" />
        <remove name="StaticFileModule" />
        <remove name="StaticCompressionModule" />
      </modules>
      <httpErrors errorMode="Detailed" />
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: 1a4d84c4-a1de-4b9f-b1ee-b0912a57ceb6-->
View Code

 

 

更新 : 2019-02-06git

最後仍是把 rewrite 給替換掉了. 因此 rewrite url 也不依賴 iis 了咯. github

refer : https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-2.2&tabs=visual-studioweb

上面這篇說明了如何使用 http redirect to https json

如今 https 都免費了嘛, 網站固然是確定要 https 丫. windows

https://certifytheweb.com/ 我用這個來製做證書... 很是方便哦.api

除了 https 還有 non-www redirect to www緩存

refer

https://stackoverflow.com/questions/43823413/redirect-non-www-to-www-using-asp-net-core-middleware

https://github.com/aspnet/BasicMiddleware/pull/297

也是原生支持的哦. 

note :  一些坑和額外知識

有一個東西叫 HSTS, asp.net core 也有支持. 

refer : 

https://blog.wilddog.com/?page_id=1493

https://www.barretlee.com/blog/2015/10/22/hsts-intro/

若是你作 https 那就一併作了吧. 

它是配合遊覽器的一個東西,大部分遊覽器都有支持了. 

主要就是防止竊聽, 當用戶第一次訪問服務器後,服務器會告訴 browser, 我這個網站只能用 https 訪問. 

那麼,日後即便用戶在地址欄輸入沒有 http 的網址,遊覽器也會自動換成 https.

還有一點就是,若是證書過時了,用戶沒法忽略它,遊覽器會徹底禁止不安全的訪問. 

上面的前提是至少訪問一次, 那若是你要更極端一點,能夠提交你的網站給遊覽器廠商, 那麼連第一次訪問也都必須是 https.

 

 

更新 : 2019-02-05

refer : 

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.2

https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-2.2

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/modules?view=aspnetcore-2.2

依賴 IIS 來處理 static file, 緩存, 壓縮, 未必就好, 

要知道 IIS 是一個你們夥, 不少歷史包袱, 並且綁定 windows 服務器. 這並不符合個 asp.net core 跨平臺的特點.

因此呢, 咱們能夠儘可能減小對 IIS 的依賴. 

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.2

這篇說了若是使用 asp.net core 來處理靜態文件和 cache control. 

https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-2.2

這篇則說了如何作壓縮文件. 

這樣咱們就不須要像從前我說的那樣處理了. 

那麼還有一個重點是, IIS 和 asp.net core 會不會打架呢? 你要處理,我也要處理...

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/modules?view=aspnetcore-2.2

這篇說了如何關掉 IIS 的處理 Module 

我是使用 webconfig 來關閉的,由於還有一些古老項目在服務器上跑着.

記得去 C:\Windows\System32\inetsrv\config 這裏打開權限, 否則 webconfig 沒法 remove module 哦.

最後 iis 剩下的 module 

anony 和 aspnetcoremodule 是必定要的, uriCache 和 httpcache 是微軟推薦要的 (asp.net core 推薦)

rewirte 用於 https and www, asp.net core 有本身的 middle 不要也能夠拿掉

custom error 和 logging 只是爲了方便 debug.

 

 

 

 

 

note :  一些坑和額外知識

1.https 狀況下要開,默認是不開的, 開以前瞭解一下 https 安全 CRIME and BREACH attacks.

services.AddResponseCompression(options => {
    options.EnableForHttps = true;
});

2. Use.. 必定要 before staticfile() and mvc() 

app.UseResponseCompression();

3. 壓縮 br 格式是 google 發明的, 視乎比 gzip 還好哦, 可是不用擔憂, asp.net core br 和 gzip 都是默認支持

 

 

更新 : 2019-02-05

refer : 

https://weblog.west-wind.com/posts/2017/Apr/27/IIS-and-ASPNET-Core-Rewrite-Rules-for-Static-Files-and-Html-5-Routing

https://weblogs.asp.net/imranbaloch/leveraging-iis-static-file-feature-in-aspnetcore

https://shiyousan.com/post/635659901987610088

https://blogs.iis.net/nazim/use-of-special-characters-like-in-an-iis-url

一直以來 url 我基本上是不放富豪的, 但最近有個項目比較奇葩, 用了空格做爲 filename

而後就發現以前的表達式不支持 %20 空格的處理, 就改了改

^.*\.(html|htm|svg|json|css|png|gif|jpg|jpeg|js|mp3|mp4|woff2|woff|ico|pdf|webmanifest)$

因而就隨便試試其它符號, 發現 + 和 % 也是不能夠。

通過測試不是 rewrite 的問題, 讀了 iis 文檔後 https://blogs.iis.net/nazim/use-of-special-characters-like-in-an-iis-url

看樣子是被禁止了, 最後總結, 仍是不要亂用符號在文件上吧.

 

 

refer : 

https://weblog.west-wind.com/posts/2017/Apr/27/IIS-and-ASPNET-Core-Rewrite-Rules-for-AspNetCoreModule

https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?tabs=aspnetcore2x

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files

https://andrewlock.net/html-minification-using-webmarkupmin-in-asp-net-core/

https://github.com/Taritsyn/WebMarkupMin

 

core host in IIS 會攔截全部的請求, 包括靜態文件

但是 IIS 處理靜態文件壓縮等等仍是不錯的 

那咱們能夠在 webconfig 裏去設置一下 

<configuration>
  <system.webServer>
    <rewrite>
        <rules>
            <rule name="wwwroot-static">
                <match url="([\S]+[.](html|htm|svg|js|css|png|gif|jpg|jpeg|json|mp3|mp4|woff|woff2))" />
                <action type="Rewrite" url="wwwroot/{R:1}" />
            </rule>
        </rules>
    </rewrite>
    <handlers>          
        <add name="StaticFileModuleSvg" path="*.svg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleJs" path="*.js" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleCss" path="*.css" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleJpeg" path="*.jpeg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleJpg" path="*.jpg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModulePng" path="*.png" verb ="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleGif" path="*.gif" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFileModuleJson" path="*.json" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFileModuleMp4" path="*.mp4" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFileModuleMp3" path="*.mp3" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFileModuleWoff" path="*.woff" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
 <add name="StaticFileModuleWoff2" path="*.woff2" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />           
    </handlers>
    <aspNetCore processPath=".\Project.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <staticContent>
      <remove fileExtension=".woff" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      <remove fileExtension=".json" />
      <mimeMap fileExtension=".json" mimeType="application/json" />
      <remove fileExtension=".mp4" />
      <mimeMap fileExtension=".mp4" mimeType="audio/mp4" />
      <remove fileExtension=".ogg" />
      <mimeMap fileExtension=".ogg" mimeType="audio/ogg" />
      <!--local iis no allow below-->
      <remove fileExtension=".less"/>
      <mimeMap fileExtension=".less" mimeType="text/css" />
      <remove fileExtension=".woff2"/>
      <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
      <clientCache cacheControlMode="UseExpires" httpExpires="Tue, 12 Jan 2027 03:14:07 GMT" />
    </staticContent>
    <defaultDocument>
      <files>
        <clear />
        <add value="index.aspx" />
        <add value="Default.aspx" />
        <add value="index.html" />
        <add value="Default.html" />
      </files>
    </defaultDocument>
  </system.webServer>
</configuration>

作一個 rewrite 還有 handlers 就能夠了. 

若是要處理 html minify 可使用這個 plugin WebMarkupMin

相關文章
相關標籤/搜索