Je rencontre un problème où, lorsque j'essaie d'accéder à mywebsiteurl/radar-input
Ou mywebsiteurl/daily-submissions
, J'obtiens une erreur 404 Not Found
, Je peux confirmer que les composants correspondants se chargent correctement lorsque je ne le fais pas ' t utiliser la méthode de routage, voici mon app-routing.module.ts
Je génère des fichiers statiques à l'aide de la commande suivante et crée un fichier .nginx
Vide et héberge ces fichiers statiques sur le serveur nginx
ng build --prod --outputPath=/<current working directory>/www
Quelqu'un peut-il fournir des conseils sur la façon de déboguer cela et de le corriger?
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { RadarInputComponent } from "./radar-input/radar-input.component";
import { LatestSubmittedProjectPageComponent } from './latest-submitted-project-page/latest-submitted-project-page.component';
const appRoutes: Routes = [
{ path: 'radar-input', component: RadarInputComponent },
{ path: 'daily-submissions', component: LatestSubmittedProjectPageComponent },
{
path: 'radar-input',
component: RadarInputComponent,
data: { title: 'Radar List' }
},
{ path: '',
redirectTo: '/radar-input',
pathMatch: 'full'
},
{ path: '**', component: RadarInputComponent }
];
@NgModule({
imports: [RouterModule.forRoot(
appRoutes,
{ enableTracing: true } // <-- debugging purposes only
)],
exports: [RouterModule]
})
export class AppRoutingModule { }
MISE À JOUR1:
J'ai regardé 404 Not Found nginx angular et créé un Staticfile
& j'ai ajouté cette ligne pushstate: enabled
Faisait toujours NOT
travaille pour moi
MISE À JOUR2:
J'ai essayé de créer un fichier nginx.conf comme ci-dessous mais j'obtiens toujours l'erreur
server {
root /www;
location / {
}
location /daily-submissions/ {
index index.html
}
}
contenu du dossier www:
drwxr-xr-x 23 username staff 736 Aug 19 13:59 ..
-rw-r--r-- 1 username staff 1440 Aug 19 13:59 runtime-es5.741402d1d47331ce975c.js
-rw-r--r-- 1 username staff 770212 Aug 19 13:59 main-es5.ded1413a886662a5ad02.js
-rw-r--r-- 1 username staff 113549 Aug 19 13:59 polyfills-es5.405730e5ac8f727bd7d7.js
-rw-r--r-- 1 username staff 14707 Aug 19 14:00 3rdpartylicenses.txt
-rw-r--r-- 1 username staff 28136 Aug 19 14:00 overlay.2663ca4a577f280aa709.png
-rw-r--r-- 1 username staff 50408 Aug 19 14:00 banner.6f97727962128487d41a.jpg
-rw-r--r-- 1 username staff 1440 Aug 19 14:00 runtime-es2015.858f8dd898b75fe86926.js
-rw-r--r-- 1 username staff 683152 Aug 19 14:00 main-es2015.81b9cbd6a9d33d23040d.js
-rw-r--r-- 1 username staff 37304 Aug 19 14:00 polyfills-es2015.5728f680576ca47e99fe.js
-rw-r--r-- 1 username staff 105076 Aug 19 14:00 styles.64346455fc558cf71e6a.css
-rw-r--r-- 1 username staff 5430 Aug 19 14:00 favicon.ico
drwxr-xr-x 14 username staff 448 Aug 19 14:00 .
-rw-r--r-- 1 username staff 1050 Aug 19 14:00 index.html
J'espère que vous savez exactement quel est le problème. Ce problème se produit dans SPA (Single Page Applications). L'URL que vous saisissez recherche le répertoire/fichier de page. Si vous allez à disons mywebsiteurl/radar-input
il recherchera le fichier radar-input
. Dans les SPA, il n'y a qu'un seul fichier et c'est index.html
pour qu'il ne trouve pas le radar-input
fichier et lancer un 404.
Les SPA ont toute leur logique, le routage dans le fichier index.html et une fois qu'il est servi, il gère tout pour vous (pas le cas pour les non-spas), donc si vous allez dans mywebsiteurl/
cela fonctionnera très bien et toutes les URL seront chargées via le routage de l'application, car mywebsiteurl/
recherchera index.html
fichier et le trouver et servir cela. Donc, si votre site Web fonctionne bien en visitant l'URL de base, cela signifie que vos fichiers statiques sont dans le bon répertoire, il vous suffit de l'ajouter à vous nginx.conf
location / {
try_files $uri /index.html; #check if uri exists else serve index.html as rewrite
}
qui essaie essentiellement de trouver d'abord le fichier dans l'URL, s'il n'existe pas, il servira le fichier index.html.
Vous pouvez essayer d'activer le hashtag dans le angular. Cela vient en aide lorsqu'un serveur Web est mal configuré, donc le routage se fera côté client. Au moins vous saurez où chercher le problème pour.
RouterModule.forRoot(routes, {useHash: true})
SI le routage est toujours incorrect avec les hashtags, cela signifie que le problème est dans la configuration du routeur, si cela fonctionne, que la configuration nginx est mauvaise.
Je pense qu'il y a un problème avec votre configuration nginx, veuillez vérifier le error.log
(devrait être /var/log/nginx
).
Et puisque vous n'utilisez pas de hachage (#
) dans l'itinéraire client, veuillez utiliser try_file
dans la configuration nginx.
Voici ma configuration nginx en tant que flux, qui fonctionne parfaitement avec les applications angular.
location /myapp/ {
alias /myapp/;
index index.html index.htm;
add_header Cache-Control no-cache;
gzip_static on;
try_files $uri /myapp/index.html;
}
J'ai essayé tous vos exemples et dans Angular8 celui de nginx.conf ne fonctionne pas, je publie ici la solution implémentée après avoir lu la documentation de nginx.
Conteneur pour Azure avec SSH activé avec Linux Alpine - taille finale 37 Mo!
#Stage 1
FROM node:12-Alpine as node
WORKDIR /app
COPY angular-app .
RUN npm install
RUN npm run build --prod
#Stage 2
FROM nginx:Alpine
LABEL maintainer="Angular for Azure App Services Container <[email protected]>"
RUN apk add openssh openrc supervisor nginx-mod-http-headers-more\
&& echo "root:Docker!" | chpasswd
COPY scripts/sshd_config /etc/ssh
COPY scripts/default.conf /etc/nginx/conf.d/
COPY scripts/supervisord.conf /etc/
RUN ssh-keygen -A
COPY --from=node /app/dist/angular-app /usr/share/nginx/html
EXPOSE 80 443 2222
CMD ["/usr/bin/supervisord"]
configuration Nginx --default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /index.html;
server_tokens off;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
header Strict-Transport-Security "max-age=15768000" always;
}
Sincères amitiés
Vous pouvez essayer de remplacer le bloc location
dans votre configuration Nginx par le code ci-dessous:
location / {
try_files $uri $uri/ /index.html;
}
Vous pouvez supprimer tout autre bloc d'emplacement que vous avez configuré. L'ajout de celui-ci devrait le faire. Il redirige toutes les demandes vers index.html