Wir haben eine Unternehmens-App, die Angular 2 für den Client verwendet. Jeder unserer Kunden hat seine eigene URL, z. B.: https://our.app.com/customer-one
Und https://our.app.com/customer-two
. Derzeit können wir das <base href...>
dynamisch mit einstellen document.location
. Der Benutzer trifft also https://our.app.com/customer-two
und <base href...>
wird eingestellt auf /customer-two
... perfekt!
Das Problem ist, wenn der Benutzer zum Beispiel bei ist https://our.app.com/customer-two/another-page
und die Seite aktualisiert oder versucht, diese URL direkt zu treffen, die URL auf <base href...>
gesetzt wird /customer-two/another-page
und die Ressourcen nicht gefunden werden können.
Wir haben Folgendes erfolglos versucht:
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var base = document.location.pathname.split('/')[1];
document.write('<base href="https://stackoverflow.com/' + base + '" />');
</script>
...
Leider haben wir keine Ideen mehr. Jede Hilfe wäre unglaublich.
Antworten:
Die markierte Antwort hier hat mein Problem nicht gelöst, möglicherweise verschiedene Winkelversionen. Ich konnte das gewünschte Ergebnis mit dem folgenden
angular cli
Befehl in Terminal / Shell erzielen :ng build --base-href /myUrl/
ng build --bh /myUrl/
oderng build --prod --bh /myUrl/
Dies ändert
<base href="https://stackoverflow.com/">
sich nur<base href="https://stackoverflow.com/myUrl/">
in der erstellten Version, was perfekt für unseren Wechsel der Umgebung zwischen Entwicklung und Produktion war. Das Beste daran war, dass keine Codebasis mit dieser Methode geändert werden muss.Um es zusammenzufassen, lassen Sie Ihre
index.html
Basis href wie folgt :<base href="https://stackoverflow.com/">
Führen Sie sie dannng build --bh ./
mit eckigem cli aus, um sie zu einem relativen Pfad zu machen, oder ersetzen./
Sie sie durch das, was Sie benötigen.Aktualisieren:
Da das obige Beispiel zeigt, wie es über die Befehlszeile ausgeführt wird, können Sie es hier zu Ihrer Konfigurationsdatei angle.json hinzufügen.
Dies wird für alle
ng serving
für die lokale Entwicklung genutztDies ist die Konfiguration, die für Konfigurationsbuilds wie prod spezifisch ist:
Die offizielle
angular-cli
Dokumentation zur Verwendung.quelle
./
für alle Standorte. Eigentlich glaube ich nicht, dass Sie pro Client bauen müssen../
war sehr unterschiedlich. Dies funktioniert so lange, bis der Benutzer zu einer Route navigiert und die Aktualisierungstaste oder -tasten des Browsers drückt. Zu diesem Zeitpunkt bearbeiten unsere Umschreibungen den Anruf, dienen der Indexseite, aber der Browser geht davon aus, dass dies./
die aktuelle Route ist und nicht der Stammordner der Webanwendung. Wir haben das Problem des OP mit einem dynamischen Index (.aspx, .php, .jsp usw.) gelöst, der die Basis href festlegt.--prod
während des Builds ändert nichts an Ihrembase href
Wert. Sie sollten hier nicht darüber sprechen.--prod
weistangular-cli
an, dieenvironment.prod.ts
Datei anstelle der Standarddateienvironment.ts
in Ihremenvironments
Ordner zu verwenden--prod
Flag kompatibel ist, da über die Bereitstellung im OP gesprochen wurde.Folgendes haben wir letztendlich getan.
Fügen Sie dies zu index.html hinzu. Es sollte das erste sein, was in diesem
<head>
Abschnitt stehtFügen Sie dann in der
app.module.ts
Datei{ provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
der Liste der Anbieter Folgendes hinzu:quelle
useValue: (window as any) ['_app_base'] || '/'
hilftAufgrund Ihrer Antwort (@sharpmachine) konnte ich sie ein wenig weiter überarbeiten, damit wir keine Funktion in hacken müssen
index.html
.Und
./shared/common-functions.util.ts
enthält:quelle
http://localhost:8080/subfolder/myapp/#/subfolder/myroute
deine so aus? Wissen Sie, wie Sie den Unterordner nach dem # entfernen können, damit er einfach sein kannhttp://localhost:8080/subfolder/myapp/#/myroute
?base href
ist nur fürLocationStrategy
AFAIK erforderlich . Wenn Sie speziellen Code für die Aktualisierung mit LocationStrategy schreiben möchten, wissen Sie nicht genau, was Sie genau meinen. Fragen Sie sich, was passiert, wenn sich meine "Basis-HREF" während einer Aktivität in meiner App ändert? Dann musste ich ja eine schmutzige Sache machen, wie dort,window.location.href = '/' + newBaseHref;
wo sie geändert werden musste. Ich bin nicht zu stolz darauf. Um ein Update zu geben, habe ich mich in meiner App von diesen Hack-Lösungen entfernt, da dies für mich zu einem Designproblem wurde. Router-Parameter funktionieren einwandfrei, also habe ich mich daran gehalten.appRoutingProvider
siehst du aus, Krishnan? Ich sehe, dass die akzeptierte Antwort dieselbe verwendet; Vielleicht haben Sie gerade seine kopiertproviders
, aber wenn nicht, können Sie mir eine Probe geben oder ihren Zweck beschreiben? Die Dokumentation nurimports
Routing-Module , es werden keine Routing-bezogenen Anbieter verwendet (soweit ich sehen kann)location /subfolder/myapp/ { try_files $uri /subfolder/myapp/index.html; } location /subfolder2/myapp/ { try_files $uri /subfolder2/myapp/index.html; }
Ich verwende das aktuelle Arbeitsverzeichnis,
./
wenn ich mehrere Apps aus derselben Domain erstelle:Nebenbei bemerkt, ich
.htaccess
unterstütze beim Routing beim erneuten Laden von Seiten:quelle
.htaccess
Datei<base href="./">
ist falsch und wird Routen wie in der/app/a/b/c
Tat vermasseln , habe es gerade getestet. Stellen Sie die Basis-HREF lieber selbst ein, wenn Sie sich nur mit einer Web-App befassen, oder werfen Sie einen Blick auf die eckige Art und Weise, die Basis-HREF bei der Bereitstellung zu ändern (hier gibt es viele Antworten, die dies erwähnen).Vereinfachung der bestehenden Antwort durch @sharpmachine .
Sie müssen kein Basis-Tag in Ihrer index.html angeben, wenn Sie einen Wert für das undurchsichtige APP_BASE_HREF-Token angeben.
quelle
Dies funktioniert gut für mich in Prod-Umgebung
quelle
In angle4 können Sie baseHref auch in .angular-cli.json-Apps konfigurieren.
in .angular-cli.json
Dadurch wird die Basis href in index.html auf MY_APP_BASE_HREF_1 aktualisiert
quelle
Wenn Sie Angular CLI 6 verwenden, können Sie die Optionen deployUrl / baseHref in angular.json verwenden (Projekte> xxx> Architekt> Build> Konfigurationen> Produktion). Auf diese Weise können Sie die baseUrl einfach pro Projekt angeben.
Überprüfen Sie, ob Ihre Einstellungen korrekt sind, indem Sie sich die index.html der erstellten App ansehen.
quelle
Add-Ons: Wenn Sie beispielsweise: / Benutzer als Anwendungsbasis für Router und / public als Basis für die Verwendung von Assets verwenden möchten
quelle
Hatte ein ähnliches Problem, tatsächlich habe ich die Existenz einer Datei in meinem Web untersucht.
probePath ist die relative URL zu der Datei, nach der Sie suchen möchten (eine Art Markierung, wenn Sie sich jetzt am richtigen Speicherort befinden), z. B. 'assets / images / thisImageAlwaysExists.png'.
quelle
Ehrlich gesagt funktioniert Ihr Fall gut für mich!
Ich benutze Angular 5.
quelle
Ich habe mich gerade geändert:
dazu:
Vergiss nicht, mit / zu enden
quelle