ASP.net Azure 上的核心服务器端重定向问题
ASP.net core server side redirect issue on Azure
我有一个使用 react-router 构建的 react.js 应用程序,为数据调用 ASP.NET 核心 2.0 restful 服务。我希望任何服务器端 404 错误都路由到“/”。我的启动中有 app.UseStatusCodePagesWithReExecute("/")
。
在我的本地主机 (iis express) 中放置显式路径时,如果输入非法路径(如预期),它会重定向到根目录,如果输入合法路径,它会实际显示相应的页面。
然而,当在 Azure 上部署同一个应用程序时,在 root 之外放置非法路径或合法路径会给我这个页面:
The resource you are looking for has been removed, had its name changed,
or is temporarily unavailable.
我不确定是否需要额外的 Azure 配置才能使其像本地主机一样工作。如有任何想法或建议,我们将不胜感激。
我刚刚部署了这个,我没有遇到任何问题,所以我假设你的中间件顺序错误,应该是这样的。验证是否按此顺序
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStatusCodePagesWithRedirects("/");
app.UseDefaultFiles(); //also add this
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
app.UseStatusCodePagesWithReExecute("/");
这应该是任何中间件之前的第一个。顺便说一下,这个中间件不会导致浏览器重定向,它只是重写了路径。所以在你的浏览器中,看起来你可以访问 /sfsdf/sdfsdfsdgfs。这对你来说可能是个问题,因为你正在使用 React。 /sfsdf/sdfsdfsdgfs 将被 react-router 拾起,如果你没有办法处理它,将无处可去。如果要引起重定向,请替换 app.UseStatusCodePagesWithReExecute("/") 并使用
app.UseStatusCodePagesWithRedirects("/");
同样,这应该是您添加的第一个中间件,并且可以更好地与您的 react-router 一起使用。
在你的重定向中间件之后添加这个中间件。
app.UseDefaultFiles();
这个中间件所做的就是在你的 site/wwwroot 文件夹中寻找 index.html(它不一定是 index.html,它也会尝试匹配其他文件)并提供服务每当请求 / 进来时。所以在 site/wwwroot 中有一个 index.html 页面,它包含你的反应应用程序。你可能已经有了这个。
您不需要任何虚拟目录来指向 /api 和一个用于 React 应用程序的目录。所以你可以把它们都去掉
React 应用程序将存在于您 site/wwwroot 的 index.html 文件中
您的 api 将存在于 mvc 控制器中。我知道你已经这样设置了。
您不需要任何虚拟目录的原因是 ASP.Net core 会为您处理所有这些。当您向/提出请求时
它将被
拾取
app.UseDefaultFiles();
这将在内部将路径重写为 /index.html
这将被静态中间件拾取,并将 return 包含您的 React 应用程序的 index.html 页面并结束请求。
现在假设您向 /blah/blah 提出请求。这将跳过前两个中间件并命中 MVC。 MVC 将查找路径 /blah/blah。如果它存在,它将 return 一些东西。如果没有,它将被您在顶部的重定向中间件拾取。这将导致重定向到 / 并且整个过程将重新开始。您不需要任何虚拟目录来实现此目的,因此您可以删除它们。
我有一个使用 react-router 构建的 react.js 应用程序,为数据调用 ASP.NET 核心 2.0 restful 服务。我希望任何服务器端 404 错误都路由到“/”。我的启动中有 app.UseStatusCodePagesWithReExecute("/")
。
在我的本地主机 (iis express) 中放置显式路径时,如果输入非法路径(如预期),它会重定向到根目录,如果输入合法路径,它会实际显示相应的页面。
然而,当在 Azure 上部署同一个应用程序时,在 root 之外放置非法路径或合法路径会给我这个页面:
The resource you are looking for has been removed, had its name changed,
or is temporarily unavailable.
我不确定是否需要额外的 Azure 配置才能使其像本地主机一样工作。如有任何想法或建议,我们将不胜感激。
我刚刚部署了这个,我没有遇到任何问题,所以我假设你的中间件顺序错误,应该是这样的。验证是否按此顺序
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStatusCodePagesWithRedirects("/");
app.UseDefaultFiles(); //also add this
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
app.UseStatusCodePagesWithReExecute("/");
这应该是任何中间件之前的第一个。顺便说一下,这个中间件不会导致浏览器重定向,它只是重写了路径。所以在你的浏览器中,看起来你可以访问 /sfsdf/sdfsdfsdgfs。这对你来说可能是个问题,因为你正在使用 React。 /sfsdf/sdfsdfsdgfs 将被 react-router 拾起,如果你没有办法处理它,将无处可去。如果要引起重定向,请替换 app.UseStatusCodePagesWithReExecute("/") 并使用
app.UseStatusCodePagesWithRedirects("/");
同样,这应该是您添加的第一个中间件,并且可以更好地与您的 react-router 一起使用。
在你的重定向中间件之后添加这个中间件。
app.UseDefaultFiles();
这个中间件所做的就是在你的 site/wwwroot 文件夹中寻找 index.html(它不一定是 index.html,它也会尝试匹配其他文件)并提供服务每当请求 / 进来时。所以在 site/wwwroot 中有一个 index.html 页面,它包含你的反应应用程序。你可能已经有了这个。
您不需要任何虚拟目录来指向 /api 和一个用于 React 应用程序的目录。所以你可以把它们都去掉
React 应用程序将存在于您 site/wwwroot 的 index.html 文件中 您的 api 将存在于 mvc 控制器中。我知道你已经这样设置了。
您不需要任何虚拟目录的原因是 ASP.Net core 会为您处理所有这些。当您向/提出请求时 它将被
拾取app.UseDefaultFiles();
这将在内部将路径重写为 /index.html
这将被静态中间件拾取,并将 return 包含您的 React 应用程序的 index.html 页面并结束请求。
现在假设您向 /blah/blah 提出请求。这将跳过前两个中间件并命中 MVC。 MVC 将查找路径 /blah/blah。如果它存在,它将 return 一些东西。如果没有,它将被您在顶部的重定向中间件拾取。这将导致重定向到 / 并且整个过程将重新开始。您不需要任何虚拟目录来实现此目的,因此您可以删除它们。