ASP.NET 5.0 Kestrel 服务器与 nginx
ASP.NET 5.0 Kestrel server with nginx
我正在尝试在 Ubuntu 上托管一个 ASP.NET 5.0(测试版 4)网站。我已经使用 nginx 配置了 Kestrel 作为反向代理,但是有几个问题阻止了它被用于生产站点:
- HTTP 404 错误页面为空白 - 有没有办法配置 ASP.NET/Kestrel 或 nginx 发送自定义页面而不是空白页面?
- 如何配置 URL 重写 - 例如,除了 ASP.NET 内容外,我还有一些静态 .htm 页面,我想重写这些页面以在没有 .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>();
}
我正在尝试在 Ubuntu 上托管一个 ASP.NET 5.0(测试版 4)网站。我已经使用 nginx 配置了 Kestrel 作为反向代理,但是有几个问题阻止了它被用于生产站点:
- HTTP 404 错误页面为空白 - 有没有办法配置 ASP.NET/Kestrel 或 nginx 发送自定义页面而不是空白页面?
- 如何配置 URL 重写 - 例如,除了 ASP.NET 内容外,我还有一些静态 .htm 页面,我想重写这些页面以在没有 .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>();
}