我正在为子域使用中间件。中间件对Request.Path
的更改如下:
URL:
http://sub1.example.com
Request.Path:
/SubdomainPages/sub1
这有效。但是,当URL包含一个页面(例如http://sub1.example.com/SomePage
)时,我得到的是空白页面。当我在NotFound()
处理程序中使用OnGet
动作结果时,也会发生同样的事情(我有/Pages/Errors/404.cshtml
)。
当我不使用中间件时,使用NotFound()
的页面和重定向错误页面效果很好。
这是子域中间件:
public class SubdomainRoutingMiddleware
{
private readonly RequestDelegate _next;
public SubdomainRoutingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
string[] Subdomains = new string[] { "sub1", "sub2" };
var parts = context.Request.Host.Value.Split('.');
if (parts.Length > 2)
{
if (Subdomains.Contains(parts[0]))
{
if (context.Request.Path.Value != "/")
context.Request.QueryString = context.Request.QueryString.Add("sayfa", context.Request.Path.Value.Substring(1));
context.Request.Path = "/SubdomainPages/" + parts[0];
}
}
await _next.Invoke(context);
}
}
这是Startup.cs文件:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStatusCodePages();
app.UseStatusCodePagesWithReExecute("/Errors/{0}");
app.UseStaticFiles();
app.UseMiddleware<SubdomainRoutingMiddleware>();
app.UseMvc();
}
}
当URL包含页面时,Request.Path已随中间件更改,路径变为:
URL:
http://sub1.example.com/SomePage
Request.Path:
/SubdomainPages/sub1/SomePage
/SomePage
存在,但/SubdomainPages/sub1/SomePage
不存在。这是错误的一部分。
我还向app.UseStatusCodePages()
添加了Startup.cs
。但是当URL包含子域时,仍然无法正常工作/调用404页面。并且不显示诸如Status Code: 404; Not Found
之类的状态消息。仍显示空白页。
答案 0 :(得分:0)
我找到了解决方法。
我还更改了中间件中的Request.Host。现在一切都按我的预期进行了。
public async Task Invoke(HttpContext context)
{
string[] Subdomains = new string[] { "sub1", "sub2" };
var parts = context.Request.Host.Value.Split('.');
if (parts.Length > 2)
{
if (Subdomains.Contains(parts[0]))
{
if (context.Request.Path.Value != "/")
context.Request.QueryString = context.Request.QueryString.Add("sayfa", context.Request.Path.Value.Substring(1));
context.Request.Path = "/SubdomainPages/" + parts[0];
// Change host (without subdomain)
context.Request.Host = new HostString("example.com");
}
}
await _next.Invoke(context);
}