Je vais développer une application Angular 2 simple. J'ai créé un projet avec routage, en utilisant Angular CLI et j'ai ajouté plusieurs composants à l'application en utilisant la commande 'ng generate component'. Puis j'ai spécifié le routage dans le fichier app-routing.module.ts comme suit.
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 est le suivant.
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 { }
Je n'ai pas ajouté de modifications pour les autres composants. J'ai ensuite déployé l'application en utilisant la commande 'ng serve' et l'application fonctionne bien avec les liens. Par exemple : http://localhost:4200/about
Mais lorsque je déploie le projet dans http-server, les liens ne fonctionnent pas comme prévu. J'ai déployé l'application en utilisant la commande 'http-server ./dist' et l'application est bien déployée, mais les liens ne fonctionnent pas. Lorsque je vais dans ' http://localhost:4200/about ', cela donne une erreur 404.
Est-ce que je fais quelque chose de mal ? Pourquoi 'ng-serve' fonctionne et 'http-server' ne fonctionne pas ?
Toute aide serait appréciée. Merci d'avance.
J'ai téléchargé mon projet sur github .
6 votes
Essayez
imports: [RouterModule.forRoot(routes, {useHash: true})],
. Si cela fonctionne de cette manière, vous devez activer le pushState HTML5 sur votre serveur de production.0 votes
@GünterZöchbauer, j'ai essayé, mais sans succès.
0 votes
Essayez également d'ajouter
pathMatch: 'full'
à cette routepath: '',
0 votes
@GünterZöchbauer merci pour votre commentaire, mais je n'arrive pas encore à obtenir du travail
0 votes
Avez-vous essayé
127.0.0.1:8081/about
conuseHash: true
o127.0.0.1:8081/#/about
(ou quelle que soit la forme de l'URL après avoir accédé à la page d'accueil) ?0 votes
Bonjour @GünterZöchbauer, Oui, vous avez raison. Lorsque j'utilise 'useHash:true' et que je vais sur les liens comme ' 172.16.3.77:8081/#/about Ils fonctionnent sans problème. Existe-t-il un moyen de supprimer le # ici ?
1 votes
Oui, ne pas utiliser
useHash:true
:D. Comme je l'ai dit dans mon commentaire initial. Vous devez configurer le serveur pour supporter le pushState HTML5.useHash:true
était seulement pour déboguer la cause du problème.0 votes
GünterZöchbauer Ah c'est ma faute. En fait, je suis assez nouveau dans tout ça. Quoi qu'il en soit, d'après votre réponse, ce que je ressens, c'est que je ne peux pas héberger mon application angular cli dans un service d'hébergement normal. Quelle est votre opinion à ce sujet ? J'ai fait quelques lectures sur les serveurs supportés par pushstate. Donc ngserve supporte push state et c'est parce que mon projet fonctionne bien avec ngserve. Mais http-server ne supporte pas pushstate.
0 votes
Si le serveur ne le prend pas en charge, ce n'est probablement pas la peine d'essayer. En général, il est assez facile pour un serveur de le prendre en charge. Il suffit qu'il renvoie
index.html
pour toute demande qui pointe vers une ressource inexistante. J'ai vu des solutions uniquement pour les clients mais je n'ai jamais regardé de plus près et je ne connais pas les inconvénients ou si cela fonctionne vraiment.0 votes
Ça va sembler être une question idiote, mais est-ce que tu as vraiment exécuté
ng build
avant d'essayer tout ça ?0 votes
@R.Richards.. :D ouais je l'ai fait. Mais je n'ai pas encore réussi à le faire fonctionner.
1 votes
@GünterZöchbauer, merci pour vos précieuses informations concernant cette question. Je vais essayer de trouver une solution à ce problème. Merci encore
2 votes
Avez-vous trouvé la solution ? J'ai le même problème.