Как обрабатывать глубокие ссылки в Angular?

Об этом было много вопросов. Я просматривал их в течение нескольких дней. Я все пробовал, и никто не работал. Да, я также проверил angular.io, и это тоже не сработало. Так что, пожалуйста, может кто-нибудь придумать окончательный ответ или указать мне тот, который я, вероятно, еще не видел?

Вот этот URL, глубокая ссылка на приложение Angular с именем whatever и его маршрут someroute с параметром.

http://somedomain.com/whatever/someroute/123456

Конечно, это приводит к ошибке 404. Необходимо настроить веб-сервер. Мой сервер запускает nginx, и я сделал это:

location / {
     try_files $uri $uri/ /whatever/index.html;
}

Теперь он перенаправляет ошибку каждого сайта 404 на этом сервере в мое приложение Angular, но это вторичная проблема. Проблема в том, что маршрут по-прежнему не хочет входить. По умолчанию маршрут / вызывается каждый раз, а не /someroute/123456.

Вместо того, чтобы указывать на различные учебники, которые я, вероятно, уже видел и пробовал, может кто-нибудь кратко объяснить, что такое тривиальная точка, которую я пропустил?

Ответ 1

Вы можете переключиться на HashLocationStrategy, т.е.

RouterModule.forRoot(appRoutes, {useHash: true});

В результате все URL-адреса приложения будут index.html, а затем "#", а затем информация о маршрутизации.

Поскольку вы всегда будете индексировать .html, независимо от маршрута, вы не получите 404 для любого действительного URL.

Ответ 2

Похоже, вы можете пропустить тег <base href="">. Этот тег сообщает маршрутизатору Angular, что такое базовый URI для вашего приложения. Если этого нет, то Angular предполагает, что начальный URI навигации (в вашем случае /whatever/someroute/123456) является базовым URI, и вся последующая маршрутизация будет выполняться относительно этого URI.

Попробуйте включить <base href="/whatever/"> в элементе <head> вашего index.html, чтобы направить маршрутизатор соответственно.

Вы также можете использовать метатег <base href=""> через ng build, если вы используете CLI Angular:

ng build --base-href '/whatever/'