Mamy aplikację dla przedsiębiorstw, która korzysta z Angular 2 dla klienta. Każdy z naszych klientów ma swój unikalny adres URL, np .: https://our.app.com/customer-one
i https://our.app.com/customer-two
. Obecnie jesteśmy w stanie ustawić <base href...>
dynamicznie za pomocą document.location
. Więc użytkownik trafia https://our.app.com/customer-two
i <base href...>
zostaje ustawiony na /customer-two
... idealny!
Problem polega na tym, że jeśli użytkownik jest na przykład pod adresem https://our.app.com/customer-two/another-page
i odświeża stronę lub próbuje bezpośrednio trafić na ten adres URL, <base href...>
zostaje ustawiony na /customer-two/another-page
i nie można znaleźć zasobów.
Bezskutecznie próbowaliśmy następujących rozwiązań:
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var base = document.location.pathname.split('/')[1];
document.write('<base href="https://stackoverflow.com/' + base + '" />');
</script>
...
Niestety, brakuje nam pomysłów. Każda pomoc byłaby niesamowita.
Odpowiedzi:
Zaznaczona tutaj odpowiedź nie rozwiązała mojego problemu, być może różne wersje kątowe. Udało mi się osiągnąć pożądany wynik za pomocą następującego
angular cli
polecenia w terminalu / powłoce:ng build --base-href /myUrl/
ng build --bh /myUrl/
lubng build --prod --bh /myUrl/
Zmienia to
<base href="https://stackoverflow.com/">
tylko<base href="https://stackoverflow.com/myUrl/">
w wersji zbudowanej, która była idealna dla naszej zmiany środowiska między programowaniem a produkcją. Najlepsze było to, że żadna baza kodu nie wymaga zmiany za pomocą tej metody.Podsumowując, zostaw swój
index.html
podstawowy href jako:<base href="https://stackoverflow.com/">
następnie uruchomng build --bh ./
z kątowym kliknięciem, aby uczynić go ścieżką względną, lub zastąp to,./
czego potrzebujesz.Aktualizacja:
Ponieważ powyższy przykład pokazuje, jak to zrobić z wiersza poleceń, oto jak dodać go do pliku konfiguracyjnego angular.json.
Zostanie to wykorzystane dla wszystkich na
ng serving
potrzeby rozwoju lokalnegoTo jest konfiguracja specyficzna dla kompilacji konfiguracyjnych, takich jak prod:
Oficjalna
angular-cli
dokumentacja odnosząc się do użytku.źródło
./
działa do wszystkich lokalizacji. Więc właściwie nie sądzę, że musisz tworzyć dla każdego klienta../
były bardzo różne. Działa, dopóki użytkownik nie przejdzie do trasy i nie naciśnie przycisku lub klawiszy odświeżania przeglądarki. W tym momencie nasze przepisywanie obsługuje wywołanie, obsługuje stronę indeksu, ale przeglądarka przyjmuje, że./
jest to bieżąca trasa, a nie folder główny aplikacji internetowej. Rozwiązaliśmy problem z OP za pomocą dynamicznego indeksu (.aspx, .php, .jsp itp.), Który ustawia podstawowy element href.--prod
podczas budowania nie zmieni twojejbase href
wartości, nie powinieneś o tym tutaj mówić.--prod
mówi,angular-cli
aby użyćenvironment.prod.ts
pliku zamiast domyślnego plikuenvironment.ts
wenvironments
folderze--prod
flagą, ponieważ rozmawiali o wdrożeniu w PO.Oto, co ostatecznie zrobiliśmy.
Dodaj to do index.html. To powinna być pierwsza rzecz w
<head>
sekcjiNastępnie w
app.module.ts
pliku dodaj{ provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
do listy dostawców, na przykład:źródło
useValue: (window as any) ['_app_base'] || '/'
pomagaNa podstawie Twojej odpowiedzi (@sharpmachine) udało mi się ją nieco zmienić, aby nie musieliśmy hakować funkcji
index.html
.I
./shared/common-functions.util.ts
zawiera:źródło
http://localhost:8080/subfolder/myapp/#/subfolder/myroute
Czy tak wygląda Twój adres ? Czy wiesz, jak pozbyć się podfolderu po znaku #, aby mógł tak po prostu byćhttp://localhost:8080/subfolder/myapp/#/myroute
?base href
jest wymagane tylko w przypadkuLocationStrategy
AFAIK. Jeśli chodzi o pisanie specjalnego kodu do obsługi odświeżania za pomocą LocationStrategy, nie jestem pewien, co dokładnie masz na myśli. Pytasz, co się stanie, jeśli mój „podstawowy href” zmieni się podczas działania w mojej aplikacji? Wtedy, tak, musiałem zrobić brudną rzecz, na przykładwindow.location.href = '/' + newBaseHref;
tam, gdzie trzeba było to zmienić. Nie jestem z tego zbyt dumna. Ponadto, aby zaktualizować, odszedłem od tych rozwiązań hakerskich w mojej aplikacji, ponieważ stawały się one dla mnie problemem projektowym. Parametry routera działają doskonale, więc trzymałem się tego.appRoutingProvider
wyglądasz, Krishnan? Widzę, że zaakceptowana odpowiedź była taka sama; może właśnie skopiowałeś jego kopięproviders
, ale jeśli nie, czy możesz dać mi próbkę lub opisać jej przeznaczenie? Dokumentacja tylkoimports
routing modułów , nie używa żadnych dostawców związanych routingu (o ile można widzę)location /subfolder/myapp/ { try_files $uri /subfolder/myapp/index.html; } location /subfolder2/myapp/ { try_files $uri /subfolder2/myapp/index.html; }
Używam bieżącego katalogu roboczego
./
podczas budowania kilku aplikacji z tej samej domeny:Na marginesie,
.htaccess
pomagam w routingu przy ponownym ładowaniu strony:źródło
.htaccess
plik<base href="./">
jest nieprawidłowa i spieprzy z trasami, tak jak/app/a/b/c
rzeczywiście, właśnie to przetestowałem. Jeśli masz do czynienia tylko z aplikacją internetową, wolisz samodzielnie ustawić podstawowy atrybut href lub przyjrzeć się kątowemu sposobowi zmiany podstawowego elementu href podczas wdrażania (jest tu wiele odpowiedzi, w których wspomina się o tym).Uproszczenie istniejącej odpowiedzi przez @sharpmachine .
Nie musisz określać znacznika podstawowego w swoim index.html, jeśli podajesz wartość dla nieprzezroczystego tokenu APP_BASE_HREF.
źródło
To działa dobrze dla mnie w środowisku produkcyjnym
źródło
W angular4 można również skonfigurować baseHref w aplikacjach .angular-cli.json.
w .angular-cli.json
spowoduje to zaktualizowanie podstawowego href w index.html do MY_APP_BASE_HREF_1
źródło
Jeśli używasz Angular CLI 6, możesz użyć opcji deployUrl / baseHref w angular.json (projekty> xxx> architekt> kompilacja> konfiguracje> produkcja). W ten sposób możesz łatwo określić baseUrl dla każdego projektu.
Sprawdź, czy ustawienia są prawidłowe, przeglądając plik index.html zbudowanej aplikacji.
źródło
Dodatki: Jeśli chcesz na przykład: / users jako podstawę aplikacji dla routera i / public jako podstawę do wykorzystania zasobów
źródło
Miałem podobny problem, w rzeczywistości skończyło się na sprawdzeniu istnienia jakiegoś pliku w mojej sieci.
probePath byłby względnym adresem URL do pliku, który chcesz sprawdzić (rodzaj znacznika, jeśli jesteś teraz we właściwej lokalizacji), np. „asset / images / thisImageAlwaysExists.png”
źródło
W pliku package.json ustaw flagę --base-href na ścieżkę względną:
źródło
Szczerze mówiąc, twoja sprawa działa dla mnie dobrze!
Używam Angular 5.
źródło
Właśnie zmieniłem:
do tego:
nie zapomnij zakończyć na /
źródło