C# 使用nginx的ASP.NET 5.0 Kestrel服务器

C# 使用nginx的ASP.NET 5.0 Kestrel服务器,c#,asp.net,nginx,asp.net-core,C#,Asp.net,Nginx,Asp.net Core,我正试图在Ubuntu上托管一个ASP.NET5.0(Beta4)网站。我已将Kestrel与nginx配置为反向代理,但有两个问题阻止它用于生产站点: HTTP 404错误页面为空白-是否有办法将ASP.NET/Kestrel或nginx配置为发送自定义页面而不是空白页面 如何配置URL重写-例如,除了ASP.NET内容之外,我还有一些静态的.htm页面,我想重写这些页面,以便在不使用.htm扩展名的情况下为它们提供服务 多亏了Matt DeKrey的建议,我使用了两个中间件实现了这一点 对

我正试图在Ubuntu上托管一个ASP.NET5.0(Beta4)网站。我已将Kestrel与nginx配置为反向代理,但有两个问题阻止它用于生产站点:

  • HTTP 404错误页面为空白-是否有办法将ASP.NET/Kestrel或nginx配置为发送自定义页面而不是空白页面
  • 如何配置URL重写-例如,除了ASP.NET内容之外,我还有一些静态的.htm页面,我想重写这些页面,以便在不使用.htm扩展名的情况下为它们提供服务

    • 多亏了Matt DeKrey的建议,我使用了两个中间件实现了这一点

      对于自定义404错误页面,我使用了:

      public class CustomErrorMiddleware
      {
          private readonly RequestDelegate next;
      
          public CustomErrorMiddleware(RequestDelegate next)
          {
              this.next = next;
          }
      
          public async Task Invoke(HttpContext context)
          {
              context.Response.StatusCode = 404;
              context.Response.ContentType = "text/html";
              await context.Response.SendFileAsync("/errors/404.html");
          }
      }
      
      对于URL重写,我使用了:

      public class UrlRewriteMiddleware
      {
          private readonly RequestDelegate next;
      
          public UrlRewriteMiddleware(RequestDelegate next)
          {
              this.next = next;
          }
      
          public async Task Invoke(HttpContext context)
          {
              // Redirect from /some/page.htm to /some/page
              Regex r1 = new Regex("^/some/[a-zA-Z0-9]+\\.htm$");
              if (r1.IsMatch(context.Request.Path.Value))
              {
                  context.Response.Redirect(context.Request.Path.Value.Substring(0, context.Request.Path.Value.Length - 4));
                  return;
              }
      
              // Rewrite from /some/page to /some/page.htm
              Regex r2 = new Regex("^/some/[a-zA-Z0-9]+$");
              if (r2.IsMatch(context.Request.Path.Value))
                  context.Request.Path = new PathString(context.Request.Path.Value + ".htm");
      
              await next(context);
          }
      }
      
      然后修改
      Startup.cs
      以使用其中的每一个。中间件是按照指定的顺序运行的,因此需要首先重写URL,以便在收到请求时修改请求。自定义404错误中间件必须是最后一个,才能捕获任何其他中间件未处理的请求。例如:

      public void Configure(IApplicationBuilder app)
      {
          app.UseMiddleware<UrlRewriteMiddleware>();
      
          app.UseStaticFiles();
      
          app.UseMvc();
      
          app.UseMiddleware<CustomErrorMiddleware>();
      }
      
      public void配置(IApplicationBuilder应用程序)
      {
      app.UseMiddleware();
      app.UseStaticFiles();
      app.UseMvc();
      app.UseMiddleware();
      }
      
      对于这两个问题,我强烈建议您查看“ASP.NET 5中间件”和
      iaApplicationBuilder的
      Run
      选项。无论是哪种选项(就像节点连接服务器),都没有现成的方法来满足您的要求,不过如果它们是单独的问题,则可以提供示例。