У нас есть корпоративное приложение, которое использует Angular 2 для клиента. У каждого из наших клиентов есть свой уникальный URL-адрес, например: https://our.app.com/customer-one
и https://our.app.com/customer-two
. В настоящее время мы можем установить <base href...>
динамическое использование document.location
. Итак, пользователь нажимает https://our.app.com/customer-two
и <base href...>
настраивается на /customer-two
... идеально!
Проблема в том, что если пользователь, например, находится в, https://our.app.com/customer-two/another-page
и он обновляет страницу или пытается напрямую перейти по этому URL-адресу, <base href...>
устанавливается значение, /customer-two/another-page
и ресурсы не могут быть найдены.
Мы безуспешно пробовали следующее:
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var base = document.location.pathname.split('/')[1];
document.write('<base href="https://stackoverflow.com/' + base + '" />');
</script>
...
К сожалению, у нас только что закончились идеи. Любая помощь была бы замечательной.
Ответы:
Отмеченный здесь ответ не решил мою проблему, возможно, разные угловые версии. Мне удалось добиться желаемого результата с помощью следующей
angular cli
команды в терминале / оболочке:ng build --base-href /myUrl/
ng build --bh /myUrl/
илиng build --prod --bh /myUrl/
Это изменяет
<base href="https://stackoverflow.com/">
To<base href="https://stackoverflow.com/myUrl/">
в построенной версию только что было идеально подходит для нашего изменения окружающей среды между развитием и производством. Лучше всего то, что кодовая база не требует изменения с помощью этого метода.Подводя итог, оставьте свой
index.html
базовый href как:<base href="https://stackoverflow.com/">
затем запуститеng build --bh ./
с angular cli, чтобы сделать его относительным путем, или замените его тем,./
что вам нужно.Обновить:
Поскольку в приведенном выше примере показано, как это сделать из командной строки, вот как добавить его в файл конфигурации angular.json.
Это будет использоваться для всех
ng serving
местных разработок.Это конфигурация, специфичная для сборок конфигурации, таких как prod:
Официальная
angular-cli
документация со ссылкой на использование.источник
./
работает для всех мест. На самом деле я не думаю, что вам нужно создавать для каждого клиента../
был совсем другим. Он работает до тех пор, пока пользователь не перейдет к маршруту и не нажмет кнопку или клавиши обновления браузера. В этот момент наши перезаписи обрабатывают вызов, обслуживают страницу индекса, но браузер предполагает, что./
это текущий маршрут, а не корневая папка веб-приложения. Мы решили проблему OP с помощью динамического индекса (.aspx, .php, .jsp и т. Д.), Который устанавливает базовый href.--prod
во время сборки не изменит вашегоbase href
значения, вам не следует об этом здесь говорить.--prod
говоритangular-cli
использоватьenvironment.prod.ts
файл вместо файла по умолчаниюenvironment.ts
в вашейenvironments
папке--prod
флагом, поскольку они говорили о развертывании в OP.Вот что мы в итоге сделали.
Добавьте это в index.html. Это должно быть первым делом в
<head>
разделеЗатем в
app.module.ts
файле добавьте{ provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
в список провайдеров, например:источник
useValue: (window as any) ['_app_base'] || '/'
помогаетОсновываясь на вашем ответе (@sharpmachine), я смог немного его реорганизовать, чтобы нам не пришлось вырезать функцию в
index.html
.И
./shared/common-functions.util.ts
содержит:источник
http://localhost:8080/subfolder/myapp/#/subfolder/myroute
А ваш? Вы знаете, как избавиться от подпапки после #, чтобы она могла быть простоhttp://localhost:8080/subfolder/myapp/#/myroute
?base href
требуется только дляLocationStrategy
AFAIK. Что касается написания специального кода для обработки обновления с помощью LocationStrategy, не уверен, что именно вы имеете в виду. Вы спрашиваете, что, если мой "базовый href" изменится во время действия в моем приложении? Тогда да, мне пришлось сделать грязную вещь, например,window.location.href = '/' + newBaseHref;
где это требовалось изменить. Я не слишком горжусь этим. Кроме того, чтобы дать обновление, я отказался от этих хакерских решений в своем приложении, поскольку это становилось проблемой для меня. Параметры маршрутизатора работают отлично, поэтому я придерживался их.appRoutingProvider
выглядишь, Кришнан? Я вижу, что в принятом ответе использовалось то же самое; может быть, вы просто скопировали егоproviders
, но если нет, можете ли вы дать мне образец или описать его назначение? В документации толькоimports
модули маршрутизации , она не использует каких-либо поставщиков, связанных с маршрутизацией (насколько я понимаю)location /subfolder/myapp/ { try_files $uri /subfolder/myapp/index.html; } location /subfolder2/myapp/ { try_files $uri /subfolder2/myapp/index.html; }
Я использую текущий рабочий каталог
./
при создании нескольких приложений из одного домена:Кстати, я использую,
.htaccess
чтобы помочь с маршрутизацией при перезагрузке страницы:источник
.htaccess
файл<base href="./">
неверно и испортит маршруты, как и в/app/a/b/c
самом деле, только что протестировал. Предпочтите устанавливать базовый href самостоятельно, если имеете дело только с веб-приложением, или взгляните на угловой способ изменения базового href при развертывании (здесь есть много ответов, в которых упоминается это).Упрощение существующего ответа по @sharpmachine .
Вам не нужно указывать базовый тег в вашем index.html, если вы указываете значение для непрозрачного токена APP_BASE_HREF.
источник
Это отлично работает для меня в среде prod
источник
В angular4 вы также можете настроить baseHref в приложениях .angular-cli.json.
в .angular-cli.json
это обновит базовый href в index.html до MY_APP_BASE_HREF_1
источник
Если вы используете Angular CLI 6, вы можете использовать параметры deployUrl / baseHref в angular.json (проекты> xxx> архитектор> сборка> конфигурации> производство). Таким образом, вы можете легко указать baseUrl для каждого проекта.
Убедитесь, что ваши настройки верны, просмотрев index.html созданного приложения.
источник
Надстройки: если вы хотите, например: / users в качестве базы приложений для маршрутизатора и / public в качестве базы для использования ресурсов.
источник
У меня была аналогичная проблема, на самом деле я решил проверить существование какого-то файла в моей сети.
probePath будет относительный URL-адрес файла, который вы хотите проверить (своего рода маркер, если вы сейчас находитесь в правильном месте), например, «assets / images / thisImageAlwaysExists.png»
источник
В package.json установите флаг --base-href на относительный путь:
источник
Откровенно говоря, у меня ваш случай работает отлично!
Я использую Angular 5.
источник
Я только что изменил:
к этому:
не забывайте заканчивать на /
источник