角度4运行项目来自dist索引而没有HashLocationStrategy页面重新加载404

时间:2017-05-24 05:48:30

标签: angular

我想从http://domain/dist/index.html

开始/加载我的网站

我已将虚拟主机指向dist / index.html,因此我可以使用此http://domain

加载我的网站

我的app.routes.ts

import { NgModule }             from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { PathLocationStrategy ,LocationStrategy } from '@angular/common';

import { SelectivePreloadingStrategy } from './selective-preloading-strategy';
import { NotFoundComponent } from './not-found/not-found.component';

const routes: Routes = [
{ path: "", loadChildren: "app/site/site-layout/site-layout.module#SiteLayoutModule" },
{ path: "admin", loadChildren: "app/admin/admin-layout/admin-layout.module#AdminLayoutModule" },
{ path: "**",    component: NotFoundComponent }
];
@NgModule({
  imports: [ RouterModule.forRoot(
      routes,
      { preloadingStrategy: SelectivePreloadingStrategy }
  )],
  exports: [ RouterModule ],
  providers: [
      { provide: LocationStrategy, useClass: PathLocationStrategy },
  ]
})
export class AppRoutingModule {}

使用上面的策略,一切都很好,但我有http:/ domain / admin是我网站的不同部分,所以当我直接从url打开它时,它会给我404错误。同样在所有其他路线上,如果我从网址加载它,它将给出404。

现在我尝试了HashLocationStrategy,解决了这个404错误问题。但是,如果我在http://domain/#并且在同一窗口上编辑网址,例如http://domain/#/admin然后前面布局的CSS会在那里。我不希望这个css在admin。它是两个布局css之间的冲突。在第二次重装时没关系。

有没有解决方案?

任何角度无条件选项而没有主题标签,而不是脸版重新加载404错误。

仅供参考,我有服务器调用NodeJS。但我希望我的网站首先从angular dist加载,而不是从服务器加载。

感谢。

1 个答案:

答案 0 :(得分:1)

它给你一个404错误,因为当你输入url并点击从你的服务器输入浏览器请求http://domain/admin(node.js)并且node.js没有那个路由时,Angular处理客户端。要解决此问题,您可以在服务器端定义每个路由,也可以执行以下操作:

app.get('/*',  function(req, res, next) {
    res.sendFile('index.html', { root: __dirname + '/dist' }); 
});

注意:index.html的文件夹路径只是一个示例。

这会将每个外部网址更改重定向到您的index.html,并从那里开始处理路由。

作为附注,我不建议使用HashLocationStrategy,因为它会制动服务器端渲染,这通常是生产环境所必需的。 有关此主题的更多信息:Is there any downside of HashLocation Strategy?