部署到Http Server时,Angular 2路由不起作用

kin*_*_ru 36 npm angular2-template angular2-routing angular-cli angular

我将开发一个简单的Angular 2应用程序.我使用Angular CLI创建了一个带路由的项目,并使用'ng generate component'命令向应用添加了几个组件.然后我在app-routing.module.ts中指定了路由,如下所示.

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
import { UserComponent } from './user/user.component';
import { ErrorComponent } from './error/error.component';
import { SpecialpageComponent } from './specialpage/specialpage.component';

const routes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'about',
    component: AboutComponent
  },
    {
    path: 'user',
    component: UserComponent
  },
  {
    path: 'specialpage',
    component: SpecialpageComponent
  },
  {
    path: '**',
    component: ErrorComponent
  }

];

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

app.module.ts如下.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AppRoutingModule } from './app-routing.module';

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
import { ErrorComponent } from './error/error.component';
import { UserComponent } from './user/user.component';
import { SpecialpageComponent } from './specialpage/specialpage.component';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    AboutComponent,
    ErrorComponent,
    UserComponent,
    SpecialpageComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

我没有为其他组件添加任何修改.然后我使用'ng serve'命令部署应用程序,该应用程序与链接正常工作.例如:http:// localhost:4200/about

在此输入图像描述

但是当我在http-server中部署项目时,链接无法按预期工作.我使用'http-server ./dist'命令部署应用程序,应用程序部署正常,但链接不起作用.当我转到' http:// localhost:4200/about '时,它会出现404错误.

在此输入图像描述

我做错了吗?为什么'ng-serve'工作和'http-server'不起作用?

任何帮助,将不胜感激.提前致谢.

我已将我的项目上传到github.

Man*_*anu 27

通过实现HashLocationStrategy添加#到您的所有路由来解决此问题.你通过添加来实现这一点HashLocationStrategy to AppModule providers.

    providers: [{provide: LocationStrategy, useClass: HashLocationStrategy}],
Run Code Online (Sandbox Code Playgroud)

并添加相应的导入

   import { HashLocationStrategy, LocationStrategy } from '@angular/common';
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题.

如果您不想使用HashLocationStrategy,则可以使用PahtLocationStrategy,因此您的Angular应用程序不会在URL中显示Hash.有关它的更多详细信息,请查看官方链接:https://angular.io/api/common/PathLocationStrategy

  • 我觉得这不应该是一件事情。修复此Google。改变整个互联网的结构来安抚我。 (2认同)

小智 14

这是因为http-server不支持像lite-server或web pack-dev服务器这样的回退.这就是为什么它显示404未找到.解决此问题有2个解决方案2解决方案:

  1. 您可以像上面提到的那样使用HashLocationStrategy.
  2. 如果要将其部署到Apache或IIS服务器,那么您只需添加此处提到的配置即可!

注意:对于开发,您可以使用lite-server.

希望这会帮助你.


小智 7

我已通过在AppModule Providers中添加以下代码解决了此问题:

providers: [{provide: LocationStrategy, useClass: PathLocationStrategy}]
Run Code Online (Sandbox Code Playgroud)

和导入

import { PathLocationStrategy, LocationStrategy } from '@angular/common';
Run Code Online (Sandbox Code Playgroud)

然后我创建了.htaccess:

RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html
Run Code Online (Sandbox Code Playgroud)

网址中没有#的情况下一切正常


Par*_*iya 5

它会发生,因为它会找到一个关于哪个页面根本不在里面的页面因此404.可能的选项:

  1. 如果你想使用http-server,那么使用一个代理,它会将所有内容重定向到http:// localhost:your-port.

    选项: -P或将--proxy所有无法在本地解析的请求代理到给定的URL.例如:-P http://someurl.com

  2. 根本不要使用快递.使用快速创建自己的http服务器并将所有内容重定向到index.html

    假设公共是你的文件夹,你保留所有转换的东西.

    var express = require('express');
    var app = express();
    
    var path = __dirname + '/public';
    var port = 8080;
    
    app.use(express.static(path));
    app.get('*', function(req, res) {
        res.sendFile(path + '/index.html');
    });
    app.listen(port);
    
    Run Code Online (Sandbox Code Playgroud)


Aru*_*ITH 5

它将通过以下方式解决:

情况1:适用于低于Angular 5.1的版本

1)使用如下所述的HashLocationStrategy:在AppModule中执行以下操作。

1.1) import { HashLocationStrategy, LocationStrategy } from '@angular/common';

1.2) providers: [{provide: LocationStrategy, useClass: HashLocationStrategy}]

情况2:适用于等于或大于Angular 5.1的版本

2.1)Angular在SameUrlNavigation上引入了此属性,以克服服务器上的刷新问题。

2.2)将onSameUrlNavigation添加 到RouterModule.forRootin imports数组中

a)在应用程序主路由模块中,即app.routing.module.ts / app.routing.ts添加属性

见下文:

@ngModule({

    imports: 
    [
       RouterModule.forRoot(routes, {onSameUrlNavigation: ‘reload’})
    ],

    exports: [RouterModule],
 });
Run Code Online (Sandbox Code Playgroud)

希望它能帮助到别人。


Sha*_*iro 5

如果您像我一样不想进行任何代码更改,只需使用以下代码即可:

https://www.npmjs.com/package/angular-http-server