C# 使用nginx的ASP.NET 5.0 Kestrel服务器
我正试图在Ubuntu上托管一个ASP.NET5.0(Beta4)网站。我已将Kestrel与nginx配置为反向代理,但有两个问题阻止它用于生产站点: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的建议,我使用了两个中间件实现了这一点 对
- 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
选项。无论是哪种选项(就像节点连接服务器),都没有现成的方法来满足您的要求,不过如果它们是单独的问题,则可以提供示例。