在子目录中部署时,Angular 6路径路径不适用于直接URL

问题描述 投票:4回答:4

app.routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './public/home/home.component';

const routes: Routes = [
  {
    path: 'customers',
    loadChildren: '../app/customers/customers.module#CustomersModule'
  },
  {
    path: 'admin',
    loadChildren: '../app/admin/admin.module#AdminModule'
  },
  {
    path: 'home',
    component: HomeComponent
  },
  {
    path: '**',    
    redirectTo: 'home',    
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

这些在开发环境下工作正常。如果我直接打开localhost:4200/home,那么它就会降落在预期的页面上。

但是,使用ng build --prod --base-href=/myngapp/构建和部署的那个只能在www.domain.com/myngapp上工作,如果我直接打开www.domain.com/myngapp/home,那么它会给404找不到错误。

angular angular2-routing
4个回答
8
投票

您需要设置正确的URL重写规则。 Angular docs解释了如何为大多数流行的http服务器执行此操作。你可以在这里找到细节。

https://angular.io/guide/deployment#production-servers

它的作用就是简单地说,无论请求的路径是什么,都要告诉服务器始终提供index.html。例如。

www.domain.com/myngapp/home - >服务index.html,而不是home.html或类似的www.domain.com/myngapp/some/child/routing - >服务index.html并且不要试图找到一些/ child / routing.html或php等等。


2
投票

您必须配置HTTP服务器(apache,Nginx或其他)以将以www.domain.com/myngapp/**开头的所有URI重定向到index.html文件。

请注意,当通过与按钮和菜单的交互访问“Angular内部”时,应用程序的路由(https://angular6demoamit.000webhostapp.com/)可以正常工作。但是,当您尝试访问在浏览器上直接键入它的路由时,服务器不知道URI https://angular6demoamit.000webhostapp.com/home是Angular应用程序的路由。它可能会尝试加载不存在的主目录的索引页。

没有一种配置可以解决您的问题。它取决于您的HTTP服务器和基础架构。阅读angular指南,它描述了某些HTTP服务器的一些配置示例:https://angular.io/guide/deployment#routed-apps-must-fallback-to-indexhtml


0
投票

如果您将文件复制到服务器子文件夹中,请附加构建标志--base-href,如果您在服务器/myngapp/index.html上有index.html文件,则添加命令with build --base-href = / myngapp / else复制所有dist文件并粘贴在没有base-href的服务器上。


-3
投票

尝试使用:

const routes: Routes = [
  {
    path: 'customers',
    loadChildren: '../app/customers/customers.module#CustomersModule'
  },
  {
    path: 'admin',
    loadChildren: '../app/admin/admin.module#AdminModule'
  },
  {
    path: 'home',
    component: HomeComponent
  },
  {
    path: '**',    
    redirectTo: 'home',    
  }
];

imports: 
RouterModule.forRoot(routes, {useHash: true})
© www.soinside.com 2019 - 2024. All rights reserved.