1

我正在为我的应用程序使用 Angular 4 + 通用版本,并在找到一些未知 URL 时使用以下代码重定向到 404 页面。

  {
path: '',
component: FullLayoutComponent,
data: {
  title: 'Home'
},
children: [
  {
    path: '',
    loadChildren: 'app/core/components/static/static.module#StaticModule'
  },
  {
    path: 'move',
    loadChildren: 'app/core/components/move/move.module#MoveModule'
  },
  {
    path: 'account',
    loadChildren: 'app/core/components/account/account.module#AccountModule'
  },
  { path: "**",redirectTo:"404"}
]

}

对于任何未知的 URL,它都会重定向到 localhost:4200/404 但如果我转到 URL localhost:4200 ,那么它也会将我重定向到 404 。

任何线索肯定会有很大帮助。

谢谢

4

2 回答 2

2

由于到目前为止的答案中缺少最重要的部分:您不仅应该进行重定向,还应该设置正确的状态码。为此,您需要 Angular 代码中的请求对象。然后,您可以访问通常附加到请求的响应对象 - 至少在 express 中。

export class NotFoundComponent implements OnInit {

  constructor(@Inject(PLATFORM_ID) private platformId: Object,
              @Optional() @Inject(RESPONSE) private response: Response) {
  }


  ngOnInit() {
    if (!isPlatformBrowser(this.platformId)) {
      this.response.status(404);
    }
  }

}

如果您使用的是 express 和 ng 通用 express 引擎,您可以将请求和响应传递给依赖注入,如下所示:

app.engine('html', (_, options, callback) => {
  renderModuleFactory(AppServerModuleNgFactory, {
    // Our index.html
    document: template,
    url: options.req.url,
    extraProviders: [
      // make req and response accessible when angular app runs on server
      <ValueProvider>{
        provide: REQUEST,
        useValue: options.req
      },
      <ValueProvider>{
        provide: RESPONSE,
        useValue: options.req.res,
      },
    ]
  }).then(html => {
    callback(null, html);
  });
})

由于我自己只是偶然发现了这个问题,因此我在博客文章中记录了我的过程。如果您需要更多指导,请查看:

https://blog.thecodecampus.de/angular-universal-handle-404-set-status-codes/

于 2018-02-07T10:18:19.737 回答
0

将您的代码更改为如下 - :

  {
path: '',
component: FullLayoutComponent,
data: {
 title: 'Home'
},
children: [
  {
   path: '',
   loadChildren:'app/core/components/static/static.module#StaticModule'
},
{
 path: 'move',
 loadChildren: 'app/core/components/move/move.module#MoveModule'
},
{
 path: 'account',
 loadChildren: 'app/core/components/account/account.module#AccountModule'
}

 ]
},

{ path: "**",redirectTo:"404"}
于 2017-09-25T09:06:39.233 回答