#html #nginx #angular #navigation
#HTML #nginx #угловой #навигация
Вопрос:
Учитывая, что Angular2 — это одностраничный сайт, нам нужно перенаправлять все URL-запросы на index.html с помощью Nginx. Вот мой серверный блок Nginx:
server {
listen 8901;
server_name my_server_ip;
root /projects/my_site/dist;
location /. .. { # files (assuming they always have a dot)
# use eg alias to serve some files here
}
location / { # url routed by client, client gives 404 for bad urls
try_files $uri /index.html;
}
}
Эта конфигурация в глобальном масштабе работает хорошо. Навигация работает, и я могу получить доступ к своим страницам напрямую, введя URL-адрес в браузере. Но есть две проблемы:
- Когда я ввожу URL-адрес в браузере, а затем нажимаю enter для запуска (или если я просто обновляю страницу), загрузка страницы занимает очень много времени, около 6 секунд. Но если я удалю перенаправление из блока сервера Nginx, это займет менее одной секунды. Но навигация по приложению (с использованием ссылок) работает так, как ожидалось.
- У меня есть ссылка на моей странице (href), которая указывает на корень (http://my_site.com /, это ссылка «домой»). Если я нажму на него, он перезагрузит всю страницу. Это неправильное поведение в Angular2, оно должно просто изменить маршрут к дому. Эта проблема возникает только на моем сервере. Если я запускаю на своем локальном компьютере, все работает хорошо, поэтому я думаю, что проблема связана с моей конфигурацией Ngninx.
Какая хорошая конфигурация для использования Nginx с Angular2?
РЕДАКТИРОВАТЬ: я начал свой проект с БЫСТРОГО ЗАПУСКА проектов из angular.io . Вот мой файл app.routing.ts:
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/index';
import { HomeComponent } from './home/index';
import { ProfileComponent, ProfileConsultComponent, ProfileHomeComponent, CoachsComponent, AthletesComponent } from './profile/index';
import { FeedPostComponent } from './feedpost/index';
import { AuthGuard } from './_guards/index';
const appRoutes: Routes = [
{ path: '', component: HomeComponent, canActivate: [AuthGuard] },
{ path: 'login', component: LoginComponent },
{ path: 'profile/:pk', component: ProfileConsultComponent },
{ path: 'home', component: ProfileHomeComponent, canActivate: [AuthGuard],
children: [
{ path: '', redirectTo: 'coachs', pathMatch: 'full' },
{ path: 'coachs', component: CoachsComponent },
{ path: 'athletes', component: AthletesComponent },
]
},
{ path: 'post/:pk', component: FeedPostComponent, canActivate: [AuthGuard] },
// otherwise redirect to home
{ path: '**', redirectTo: '' }
];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
И я импортировал routing
в @NgModule
import
раздел моего файла app.module.ts.
Ответ №1:
Мне удалось правильно настроить nginx для ожидаемой работы с Angular 2. Вот мой серверный блок:
server {
listen 80;
server_name my_server_name;
root /projects/angular2/myproject/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
Комментарии:
1. Я думаю, что наиболее полная настройка будет использоваться
try_files $uri $uri/ /index.html =404;
.
Ответ №2:
Вы не должны добавлять перенаправление на nginx, но измените маршрутизацию вашего сервера приложений, чтобы обслуживать страницу, содержащую ваше приложение, по путям, которые являются допустимыми на стороне клиента.
Это хорошо объяснено здесь для экспресс-приложения. (начало в 2:00)
Редактировать
https://www.youtube.com/watch?v=ANfplcxnl78amp;index=2amp;list=PLOa5YIicjJ-VA38pChXHhq8jY2U8iYynr
для nginx это должно быть что-то вроде
location ~ ^/([^/] )/([^/?] )$ {
/index.html;
}
try_files проверит наличие файла, указанного в пути, и не будет работать
Вам также потребуется удалить первую спецификацию
Комментарии:
1. На видео есть файл с именем lesson-server.ts. В проекте Angular2 quickstart отсутствует файл server.ts. Я не совсем понимаю смысл видео, которое вы опубликовали. Можете ли вы написать простой пример? Я обновлю свой пост с файлом маршрутизации.
2. Насколько я понимаю, ваш пример работает с Firebase. Я не использую Firebase на своем сервере, я использую Nginx. Вот почему я думаю, что конфигурация перенаправления должна быть установлена на стороне Nginx. Я ошибаюсь?
3. Хорошо, я думал, что у вас есть nginx перед вашим сервером, но он действительно обслуживает файлы. Вы должны убедиться, что все входящие пути (http:/myserver/ogin/index , http:/myserver/feedpost/index ) подавать index.html . Я не эксперт по nginx, но это должно быть что-то вроде отредактированного ответа
4. Спасибо за вашу правку. Теперь у меня возникает эта ошибка при запуске
sudo nginx -t
:ben@DevUsine:~$ sudo nginx -t nginx: [emerg] unknown directive "/index.html" in /etc/nginx/sites-enabled/workout_frontend_staging:7 nginx: configuration file /etc/nginx/nginx.conf test failed