Развертывание приложения angular на Apache Tomcat 404 проблема глубоких ссылок
Я пытаюсь выяснить, как настроить сервер Apache Tomcat для обслуживания углового приложения с глубокими ссылками. Например:
статический сервер обычно возвращает индекс.html, когда он получает запрос на mysite.com/. Но она отвергает mysite.com/heroes/42 и возвращает ошибку 404 - Not Found, если она не настроена для возврата индекса.вместо этого html.
Я хочу обслуживать угловое приложение на localhost / angular, я пробовал следующее:
1) построить угловые применение с:
ng build --prod --base-href .
2) скопируйте содержимое папки сборки (по умолчанию: dist) в $ApacheLocation/webapps/angular
3) Добавьте перезаписи в $ApacheLocation/conf/Catalina/localhost / rewrite.config
# 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 ^/angular/.*$ /angular/index.html
4) Добавление клапана чуть ниже метки Хоста
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve"/>
5) запуск сервера Tomcat и переход на localhost / angular даст мне:
Uncaught SyntaxError: неожиданный токен для всех .расслоения js (e.g главный.пачка.в JS)
Если я не включаю правила перезаписи, tomcat будет служить localhost / angular как ожидалось но даст 404 по глубоким ссылкам.
Мои настройки:
- tomcat версии 9.0.0.М26
- угловое версии 4.4.2
- @angular / cli: 1.4.2
- узел: 8.5.0
- npm: 5.4.2
- ОС: Linux x64
1 ответов
мне удалось исправить эту проблему e.g http://localhost:8080/angular/player/detail/4 со следующими шагами:
1) построить угловое приложение с: ng build --prod-bh ./ -д /углового
2) скопируйте содержимое встроенного приложения в $ApacheLocation/webapps / angular
3) правило перезаписи:
RewriteCond %{REQUEST_PATH} !-f
RewriteRule ^/angular/(.*) /angular?path=
4) Настройка навигации в приложении.деталь.ТС:
constructor(private activatedRoute: ActivatedRoute, private router: Router) { }
ngOnInit() {
const path = this.activatedRoute.snapshot.queryParams['path'];
const navigateTo = '/' + path;
if (path) {
this.router.navigate([navigateTo]);
}
}
вы можете найти здесь тестовый проект : https://github.com/avuletica/test
объяснение правил перезаписи:
# %{REQUEST_PATH} corresponds to the full path that is used for mapping.
# ! NOT character
# '-f' (is regular file) Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.
# ^ matches the beginning of the string or line
# . matches any charceter except line breaks
# * match 0 or more of the preceding token
Так что в основном, если нет файла на / angular / anything tomcat отправляет полный путь в виде строки запроса в angular application и из этого запроса param angular обрабатывает маршрутизацию.