我有一个dot net core web应用程序,带有一些mvc控制器和一个有角度的2应用程序。我正在尝试重写请求路径,例如" www.example.com/old/path"到" www.example.com/new/path"然后将其发送到angular 2 app(其路由设置仅适用于" new / path")。但是,尽管重写似乎已经奏效(从断点判断),但Angular仍然保持着老路。我怀疑这可能反映了我对中间件执行顺序的理解上的某种差距(但我尝试过不同的命令并且在任何地方发送重写代码都无用)。
这是url重写中间件的样子(UrlRewritingMiddleware.cs):
public sealed class UrlRewritingMiddleware
{
private readonly RequestDelegate _next;
private readonly string OldPathSegment= "/old/path/";
private readonly string NewPathSegment= "/new/path/";
public UrlRewritingMiddleware(RequestDelegate next)
{
this._next = next;
}
private void RewriteUrl(HttpContext context)
{
if (context.Request.Path.Value.IndexOf(OldPathSegment, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
context.Request.Path = new PathString(Regex.Replace(context.Request.Path.Value, OldPathSegment, NewPathSegment, RegexOptions.IgnoreCase));
}
}
public async Task Invoke(HttpContext context)
{
RewriteUrl(context);
await _next.Invoke(context);
if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
{
context.Request.Path = "/app/root/index.html";
context.Response.StatusCode = 200;
await _next.Invoke(context);
RewritePathsInContext(context);//spam
}
else
{
//spam
RewritePathsInContext(context);
}
}
}
然后这就是Startup.cs Configure方法的样子:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//putting in the beginning, I get error in angular
//EXCEPTION: Uncaught (in promise): Error: Cannot match any routes. URL Segment: '/old/path'
app.UseUrlRewritingMiddleware();
app.AnotherCustomMiddleware();//I can see Path changed to new/path inside here
app.UseDefaultFiles();
app.UseMvc();
app.UseStaticFiles();
//putting this at the end gives me 404 in asp.net
//app.UseUrlRewritingMiddleware();
}
答案 0 :(得分:2)
经过一夜安眠之后,我意识到服务器端重写请求路径不会改变浏览器中显示的URL(这是角度得到的)。因此,www.example.com/old/path将在浏览器中保持不变,只有重定向可以将其更改为www.example.com/new/path(这不是我想要的)。要解决这个问题,我必须在角度应用程序本身中添加重定向。我的角度应用程序也调用了一些mvc控制器/视图,但它们始终采用/ new / path格式,所以此时我不需要服务器端重写。
另外,关于中间件的顺序,我怀疑将它放在最后的原因给我在asp.net中的404可能是因为它来自UseMvc中间件(已经设置了路由?)。 Haven没有对它进行过测试,但只要它出现在UseMvc中间件之前,我认为它应该可行。 编辑:请参阅下面的ssmith评论。 UseMvc是一个终端中间件,所以在它之后的任何事情都无法工作。
如果你确实需要服务器端网址重写,asp.net核心有re-writing middleware你可以使用,而且实际上不需要自己编写:
var options = new RewriteOptions()
.AddRewrite(@"/old/path/", "/new/path/", skipRemainingRules: true);
app.UseRewriter(options);