#c# #angular #asp.net-mvc #routes
#c# #angular #asp.net-mvc #маршруты
Вопрос:
В моем приложении я создал маршруты, они отлично работают на локальном хосте, я могу перейти к:
localhost:4200/about
но при развертывании в рабочей среде, если я перейду к:
myapp.com/about
произойдет то, что браузер почти мгновенно перепишет URL на: myapp.com/index.html
, а затем сразу после этого конечный URL, который я увижу на панели навигации браузера, будет путем по умолчанию: «myapp.com /»
Мой код маршрутизации:
const appRoutes: Routes = [
{ path: "", redirectTo: "/", pathMatch: "full" },
{ path: "about", component: AboutComponent },
{ path: "**", redirectTo: "/" },
];
@NgModule({
imports: [
RouterModule.forRoot(appRoutes)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {}
и я добавил модуль приложения, который, как я прочитал, может помочь:
providers: [{provide: LocationStrategy, useClass: PathLocationStrategy}]
,
на стороне серверной части (интерфейс и серверная часть находятся в одном проекте) это код:
public void Configure(
....
app.UseDefaultFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes => {
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute("spa-fallback", new { controller = "Home", action = "Index"
});
});
app.UseSpa(spa => {
spa.Options.SourcePath = "FrontEnd";
if (env.IsDev()) {
spa.UseAngularCliServer(npmScript: "start");
}
});
в HomeController
:
public IActionResult Index() => Redirect("index.html");
файл web.config
:
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>
Таким образом, в основном при любом развертывании, если я попытаюсь перейти к своему маршруту « /about
«, он просто перепишет index.html
, а затем перенаправит на «/»
Есть идеи?
Комментарии:
1.
ng build --prod
не могли бы вы применить флаг —prod при создании приложения angular?2. да, это моя команда docker для сборки образа: «ЗАПУСТИТЬ npm run build — —prod »
3. на вкладке сеть в Chrome, когда я пытаюсь добраться до своего маршрута, я вижу, что запрос Get получает код ошибки 302, а затем Index..html получает запрос
4.
{ path: "", redirectTo: "/", pathMatch: "full" },
здесьredirectTo:/
это не требуется.5. удалено, но та же проблема
Ответ №1:
Это работает для меня, но на сервере IIS. Создайте файл web.config и поместите его в корневую папку файлов Angular dist.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Angular Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/frontend/" />//Folder with my Angular files
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>