Я использую версию Angular 2.0.0-alpha.30. При перенаправлении на другой маршрут, затем обновите браузер, показывая Cannot GET / route.
Можете ли вы помочь мне понять, почему произошла эта ошибка.
angular
angular2-routing
Винз и Тонз
источник
источник
Ответы:
При использовании маршрутизации html5 вам необходимо сопоставить все маршруты в вашем приложении (в настоящее время 404) с index.html на стороне сервера. Вот несколько вариантов для вас:
используя live-сервер: https://www.npmjs.com/package/live-server
используя nginx: http://nginx.org/en/docs/beginners_guide.html
Tomcat - настройка файла web.xml. Из комментария Кунина
источник
pub serve
? Таким образом, мне не нужноpub build
много во время разработки. Я пытался, ноproxy_pass
не очень хорошо работает сerror_page
.Отказ от ответственности: это исправление работает с Alpha44
У меня была та же проблема, и я решил ее, реализовав HashLocationStrategy, указанный в предварительной версии Angular.io API.
https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.html
Начните с импорта необходимых директив
И, наконец, загрузите все вместе, вот так
Ваш маршрут будет выглядеть как http: // localhost / # / route, и когда вы обновитесь, он перезагрузится в нужном месте.
Надеюсь, это поможет!
источник
#
будет автоматически добавлено в URL. Есть ли решение, чтобы удалить # из URL с помощью этого?#
будет оптимальным.PathLocationStrategy
но это не работает для меня. Либо я использовал неправильный метод, либо я не знаю, как использовать PathLocationStrategy.Angular по умолчанию использует HTML5 pushstate (
PathLocationStrategy
в сленге Angular).Вам либо нужен сервер, который обрабатывает все запросы, как он запрашивал,
index.html
или вы переключаетесь наHashLocationStrategy
(с # в URL для маршрутов) https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class. HTMLСмотрите также https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/
Чтобы переключиться на
HashLocationStrategy
использованиеобновление для> = RC.5 и 2.0.0 final
или короче с
useHash
убедитесь, что у вас есть все необходимые импортные
Для нового (RC.3) роутера
может вызвать 404, а также.
Требуется вместо
обновление для> = RC.x
обновление для> = beta.16 Импорт изменился
<beta.16
Смотрите также https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26 критические изменения
источник
update for >= RC.x
(RC.2) работаетrouter 3.0.0-alpha.7
, но помеченprovide
как устаревший без информации о том, какая функция его заменила.{provide: SomeClass, useClass: OtherClass}
Я думаю, что вы видите ошибку, потому что вы запрашиваете http: // localhost / route, который не существует. Вы должны убедиться, что ваш сервер будет сопоставлять все запросы с вашей главной страницей index.html.
Так как Angular 2 использует маршрутизацию html5 по умолчанию, а не хэши в конце URL, обновление страницы выглядит как запрос другого ресурса.
источник
Это обычная ситуация во всех версиях маршрутизатора, если вы используете стратегию расположения HTML по умолчанию.
Что происходит, что URL в строке браузера является нормальным полным HTML URL, как, например:
http://localhost/route
.Поэтому, когда мы нажимаем Enter на панели браузера, на сервер отправляется фактический HTTP-запрос для получения файла с именем
route
.На сервере такого файла нет, и на сервере не настроено что-то вроде express для обработки запроса и предоставления ответа, поэтому сервер возвращает 404 Not Found, поскольку не смог найти
route
файл.Мы хотим, чтобы сервер возвращал
index.html
файл, содержащий одностраничное приложение. Затем маршрутизатор должен запустить и обработать/route
URL-адрес и отобразить сопоставленный ему компонент.Таким образом, чтобы решить эту проблему, нам нужно настроить сервер на возврат
index.html
(при условии, что это имя вашего одностраничного файла приложения) в случае, если запрос не может быть обработан, в отличие от 404 Not Found.Способ сделать это будет зависеть от используемой технологии на стороне сервера. Например, если это Java, вам может понадобиться написать сервлет, в Rails он будет другим и т. Д.
Чтобы привести конкретный пример, если, например, вы используете NodeJ, вам нужно написать промежуточное программное обеспечение, например:
А затем зарегистрируйте его в самом конце цепочки промежуточного программного обеспечения:
Это будет служить
index.html
вместо возврата 404, маршрутизатор сработает, и все будет работать, как ожидалось.источник
Убедитесь, что это помещено в элемент head вашего index.html:
Пример в Angular2 Routing & Навигация документации использует следующий код в голове вместо (они объясняют , почему в живом примере нотой документации):
Когда вы обновляете страницу, это динамически устанавливает базовый href для вашего текущего document.location. Я мог видеть, что это вызывает некоторую путаницу для людей, просматривающих документацию и пытающихся скопировать поршень.
источник
Если вы хотите иметь возможность вводить URL-адреса в браузере без настройки вашего AppServer для обработки всех запросов к index.html, вы должны использовать HashLocationStrategy .
Самый простой способ настроить это:
Вместо того:
С HashLocationStrategy ваши URL будут выглядеть так:
источник
#
от URL, мы можем удалить это?У меня была такая же проблема с использованием webpack-dev-server. Мне пришлось добавить опцию devServer в мой веб-пакет.
Решение:
источник
Если вы используете Apache или Nginx в качестве сервера, вы должны создать
.htaccess
RewriteEngine (если он не был создан ранее) и «On»источник
Мой сервер Apache, что я сделал, чтобы исправить 404, когда обновление или глубокие ссылки очень просты. Просто добавьте одну строку в конфигурации Apache vhost:
Таким образом, любая ошибка 404 будет перенаправлена в index.html, чего и требует маршрутизация angular2.
Пример файла vhost:
Независимо от того, какой сервер вы используете, я думаю, что весь смысл в том, чтобы выяснить, как настроить сервер для перенаправления 404 в ваш index.html.
источник
Конфигурация сервера не является решением для SPA, что даже я думаю. Вы не хотите перезагружать угловой SPA снова, если неправильный маршрут входит, не так ли? Поэтому я не буду зависеть от маршрута сервера и перенаправления на другой маршрут, но да, я позволю index.html обрабатывать все запросы для угловых маршрутов углового пути приложения.
Попробуйте это вместо других или неправильных маршрутов. Это работает для меня, не уверен, но кажется, что работа в процессе. Наткнулся на это сам, когда столкнулся с проблемой.
https://github.com/angular/angular/issues/4055
Однако не забудьте настроить папки вашего сервера и право доступа на случай, если у вас есть HTML или веб-сценарии, которые не являются SPA. В противном случае вы столкнетесь с проблемами. Для меня, когда я сталкивался с такой проблемой, как ты, это была смесь конфигурации сервера и выше.
источник
для angular 5 quick fix, отредактируйте app.module.ts и добавьте
{useHash:true}
после appRoutes.источник
Angular-приложения - идеальные кандидаты для работы с простым статическим HTML-сервером. Вам не нужен серверный движок для динамического создания страниц приложения, потому что Angular делает это на стороне клиента.
Если приложение использует маршрутизатор Angular, необходимо настроить сервер так, чтобы он возвращал страницу хоста приложения (index.html) при запросе файла, которого у него нет.
Маршрутизируемое приложение должно поддерживать «глубокие ссылки». Глубокая ссылка - это URL, который указывает путь к компоненту внутри приложения. Например, http://www.example.com/heroes/42 - это глубокая ссылка на страницу сведений о герое, которая отображает героя с id: 42.
Нет проблем, когда пользователь переходит на этот URL из запущенного клиента. Маршрутизатор Angular интерпретирует URL-адрес и маршруты к этой странице и герою.
Но если щелкнуть ссылку в сообщении электронной почты, ввести ее в адресную строку браузера или просто обновить браузер, находясь на странице сведений о герое, - все эти действия выполняются самим браузером вне выполняемого приложения. Браузер делает прямой запрос к серверу для этого URL, минуя маршрутизатор.
Статический сервер обычно возвращает index.html, когда получает запрос на http://www.example.com/ . Но он отклоняет http://www.example.com/heroes/42 и возвращает ошибку 404 - Не найдено, если только он не настроен на возврат index.html.
Если эта проблема возникла в производстве, выполните следующие действия
1) Добавьте файл Web.Config в папку src вашего углового приложения. Поместите ниже код в нем.
2) Добавить ссылку на него в angular-cli.json. В angular-cli.json поместите Web.config в блок ресурсов, как показано ниже.
3) Теперь вы можете построить решение для производства, используя
Это создаст папку dist. Файлы внутри папки dist готовы к развертыванию в любом режиме.
источник
Вы можете использовать это решение для среднего приложения, я использовал ejs в качестве движка представления:
а также установить в angular-cli.json
это будет нормально работать вместо
проблема создания с вызовами get db и возвращением index.html
источник
Для тех из нас, кто борется за жизнь в IIS: используйте следующий код PowerShell, чтобы исправить эту проблему на основе официальных документов Angular 2 (которые кто-то разместил в этой теме? Http://blog.angular-university.io/angular2-router/ )
Это перенаправляет 404 в файл /index.html в соответствии с предложением в документах Angular 2 (ссылка выше).
источник
Вы можете попробовать ниже. Меня устраивает!
main.component.ts
Вы можете дополнительно улучшить path.substr (2) для разделения на параметры маршрутизатора. Я использую угловой 2.4.9
источник
Я просто добавляю .htaccess в корень.
здесь я просто добавляю точку '.' (родительский каталог) в /index.html в ./index.html,
чтобы убедиться, что ваш файл index.html в базовом пути является основным путем к каталогу и задан в сборке проекта.
источник
Я хотел сохранить URL-путь к подстраницам в режиме HTML5 без перенаправления обратно в индекс, и ни одно из решений там не говорило мне, как это сделать, поэтому я так и сделал:
Создайте простые виртуальные каталоги в IIS для всех ваших маршрутов и укажите их в корневом каталоге приложения.
Оберните ваш system.webServer в файле Web.config.xml с помощью этого тега местоположения, в противном случае вы получите повторяющиеся ошибки при загрузке Web.config во второй раз с виртуальным каталогом:
источник
Я проверил в угловых 2 семян, как это работает.
Вы можете использовать express-history-api-fallback для автоматического перенаправления при перезагрузке страницы.
Я думаю, что это самый элегантный способ решить эту проблему IMO.
источник
Если вы хотите использовать PathLocationStrategy:
Одностраничное приложение с Java EE / Wildfly: конфигурация на стороне сервера
источник
2017-July-11: так как это связано с вопросом, в котором есть эта проблема, но с использованием Angular 2 с Electron, я добавлю свое решение здесь.
Все, что мне нужно было сделать, это удалить
<base href="./">
из моего index.html, и Electron снова начал успешно перезагружать страницу.источник
Добавить импорт:
А в провайдере NgModule добавьте:
В основном index.html файле приложения измените базовый href
./index.html
с/
Приложение, развернутое на любом сервере, даст реальный URL-адрес страницы, к которой можно получить доступ из любого внешнего приложения.
источник
Простое добавление .htaccess в root разрешило 404 при обновлении страницы в angular 4 apache2.
источник
Я думаю, что вы получаете 404, потому что вы запрашиваете http: // localhost / route, которого нет на сервере tomcat. Поскольку Angular 2 использует маршрутизацию html 5 по умолчанию, а не использует хэши в конце URL, обновление страницы выглядит как запрос другого ресурса.
При использовании угловой маршрутизации на tomcat вам необходимо убедиться, что ваш сервер будет сопоставлять все маршруты в вашем приложении с вашим основным index.html при обновлении страницы. Есть несколько способов решить эту проблему. Что бы ни подходило вам, вы можете пойти на это.
1) Поместите приведенный ниже код в web.xml вашей папки развертывания:
2) Вы также можете попробовать использовать HashLocationStrategy с # в URL для маршрутов:
Попробуйте использовать:
RouterModule.forRoot (маршруты, {useHash: true})
Вместо того:
RouterModule.forRoot (маршруты)
С HashLocationStrategy ваши URL будут выглядеть так:
HTTP: // локальный / # / маршрут
3) Tomcat URL Rewrite Valve: переписать URL-адреса, используя конфигурацию на уровне сервера, чтобы перенаправить на index.html, если ресурс не найден.
3.1) Внутри папки META-INF создайте файл context.xml и скопируйте нижеприведенный контекст внутри него.
3.2) Внутри WEB-INF создайте файл rewrite.config (этот файл содержит правило перезаписи URL и используется tomcat для перезаписи URL). Внутри rewrite.config скопируйте содержимое ниже:
источник
Это не правильный ответ, но при обновлении вы можете перенаправить все мертвые звонки на домашнюю страницу, пожертвовав 404-й страницей, это временный взлом, просто воспроизведите следующий файл 404.html
источник
Лучшее решение проблемы «маршрутизатор не работает при перезагрузке браузера» состоит в том, что мы должны использовать spa-fallback. Если вы используете приложение angular2 с ядром asp.net, мы должны определить его на странице «StartUp.cs». под MVC роуты. Я прилагаю код.
источник
Ответ довольно хитрый. Если вы используете простой старый сервер Apache (или IIS), вы получите проблему, потому что страницы Angular не существуют на самом деле. Они «вычисляются» из углового маршрута.
Есть несколько способов решить проблему. Одним из них является использование HashLocationStrategy, предлагаемой Angular. Но в URL добавлен четкий знак. Это в основном для совместимости с Angular 1 (я предполагаю). Дело в том, что часть после резкого не является частью URL (тогда сервер разрешает часть до знака "#"). Это может быть прекрасно.
Здесь расширенный метод (на основе трюка 404). Я предполагаю, что у вас есть «распределенная» версия вашего углового приложения (
ng build --prod
если вы используете Angular-CLI), и вы получаете доступ к страницам напрямую с вашего сервера, и PHP включен.Если ваш веб-сайт основан на страницах (например, Wordpress), и у вас есть только одна папка, посвященная Angular (в моем примере с именем «dist»), вы можете сделать что-то странное, но, в конце концов, простое. Я предполагаю, что вы сохранили свои угловые страницы в "/ dist" (с соответствующим
<BASE HREF="/dist/">
). Теперь используйте перенаправление 404 и помощь PHP.В вашей конфигурации Apache (или в
.htaccess
файле вашего углового каталога приложения) вы должны добавитьErrorDocument 404 /404.php
404.php начнется со следующего кода:
где
$angular
значение хранится в HREF вашего углаindex.html
.Принцип довольно прост: если Apache не находит страницу, в скрипт PHP делается перенаправление 404. Мы просто проверяем, находится ли страница внутри каталога угловых приложений. Если это так, мы просто загружаем index.html напрямую (без перенаправления): это необходимо для сохранения URL-адреса без изменений. Мы также изменили код HTTP с 404 на 200 (лучше для сканеров).
Что делать, если страница не существует в угловом приложении? Ну, мы используем «ловить все» углового маршрутизатора (см. Документацию углового маршрутизатора).
Этот метод работает со встроенным приложением Angular внутри основного веб-сайта (думаю, так будет и в будущем).
НОТЫ:
mod_redirect
(путем переписывания URL-адресов) вовсе не является хорошим решением, поскольку файлы (например, ресурсы) должны быть действительно загружены, тогда это намного более рискованно, чем просто использование решения «не найдено».ErrorDocument 404 /dist/index.html
работает, но Apache все еще отвечает с кодом ошибки 404 (что плохо для сканеров).источник
Это не постоянное решение проблемы, а скорее обходной путь или взлом
У меня была такая же проблема при развертывании моего Angular App на gh-страницах. Сначала меня встретили 404 сообщениями при обновлении моих страниц на gh-страницах.
Тогда, как указал @gunter, я начал использовать,
HashLocationStrategy
который был предоставлен в Angular 2.Но это связано с его собственным набором проблем:
#
в URL это было действительно плохо, поэтому URL выглядел странноhttps://rahulrsingh09.github.io/AngularConcepts/#/faq
.Я начал исследовать эту проблему и наткнулся на блог. Я попытался дать ему шанс, и это сработало.
Вот что я сделал, как упоминалось в этом блоге.
Ссылка backalleycoder Спасибо @Daniel за этот обходной путь.
Теперь приведенный выше URL-адрес меняется на https://rahulrsingh09.github.io/AngularConcepts/faq
источник
Я исправил это (используя бэкэнд Java / Spring), добавив обработчик, который соответствует всем определенным в моих маршрутах Angular, который отправляет index.html вместо 404. Затем он эффективно (повторно) загружает приложение и загружает правильную страницу. У меня также есть обработчик 404 для всего, что не поймано этим.
источник
Если вы используете Apache или Nginx в качестве сервера, вам нужно создать .htaccess
источник