Nous avons une application d'entreprise qui utilise Angular 2 pour le client. Chacun de nos clients a sa propre URL unique, ex: https://our.app.com/customer-one
et https://our.app.com/customer-two
. Actuellement, nous sommes en mesure de définir <base href...>
dynamiquement l'utilisation document.location
. Alors l'utilisateur frappe https://our.app.com/customer-two
et <base href...>
se prépare à /customer-two
... parfait!
Le problème est que si l'utilisateur est par exemple sur https://our.app.com/customer-two/another-page
et qu'il actualise la page ou essaie d'accéder directement à cette URL, le <base href...>
paramètre est défini sur /customer-two/another-page
et les ressources sont introuvables.
Nous avons essayé ce qui suit en vain:
<!doctype html>
<html>
<head>
<script type='text/javascript'>
var base = document.location.pathname.split('/')[1];
document.write('<base href="https://stackoverflow.com/' + base + '" />');
</script>
...
Malheureusement, nous sommes à court d'idées. Toute aide serait incroyable.
Réponses:
La réponse marquée ici n'a pas résolu mon problème, peut-être différentes versions angulaires. J'ai pu obtenir le résultat souhaité avec la
angular cli
commande suivante dans le terminal / shell:ng build --base-href /myUrl/
ng build --bh /myUrl/
oung build --prod --bh /myUrl/
Cela change la
<base href="https://stackoverflow.com/">
à<base href="https://stackoverflow.com/myUrl/">
la version intégrée que ce qui était parfait pour notre changement dans l' environnement entre le développement et la production. La meilleure partie était qu'aucune base de code ne nécessite d'être modifiée à l'aide de cette méthode.Pour résumer, laissez votre
index.html
href de base comme:<base href="https://stackoverflow.com/">
puis exécutezng build --bh ./
avec angular cli pour en faire un chemin relatif, ou remplacez le./
par ce dont vous avez besoin.Mettre à jour:
Comme l'exemple ci-dessus montre comment le faire à partir de la ligne de commande, voici comment l'ajouter à votre fichier de configuration angular.json.
Cela sera utilisé pour tous
ng serving
pour le développement localCeci est la configuration spécifique pour les versions de configuration telles que prod:
La documentation officielle relative
angular-cli
à l'utilisation.la source
./
fonctionne pour tous les emplacements. Donc en fait, je ne pense pas que vous deviez construire par client../
a été très différente. Cela fonctionne jusqu'à ce que l'utilisateur accède à un itinéraire et appuie sur le bouton ou les touches d'actualisation du navigateur. À ce stade, nos réécritures gèrent l'appel, servent la page d'index, mais le navigateur suppose qu'il./
s'agit de l'itinéraire actuel et non du dossier racine de l'application Web. Nous avons résolu le problème de l'OP avec un index dynamique (.aspx, .php, .jsp, etc.) qui définit le href de base.--prod
pendant la construction ne changera pas votrebase href
valeur, vous ne devriez pas en parler ici.--prod
ditangular-cli
d'utiliser leenvironment.prod.ts
fichier au lieu du fichier par défautenvironment.ts
dans votreenvironments
dossier--prod
drapeau puisqu'ils parlaient de déploiement dans l'OP.Voici ce que nous avons fini par faire.
Ajoutez ceci à index.html. Ce devrait être la première chose de la
<head>
sectionPuis dans le
app.module.ts
fichier, ajoutez{ provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
à la liste des fournisseurs, comme ceci:la source
useValue: (window as any) ['_app_base'] || '/'
aideSur la base de votre réponse (@sharpmachine), j'ai pu la refactoriser un peu plus, afin que nous n'ayons pas à pirater une fonction
index.html
.Et,
./shared/common-functions.util.ts
contient:la source
http://localhost:8080/subfolder/myapp/#/subfolder/myroute
est-ce à quoi ressemble la vôtre? Savez-vous comment vous débarrasser du sous-dossier après le # pour qu'il puisse l'êtrehttp://localhost:8080/subfolder/myapp/#/myroute
?base href
n'est requis que pourLocationStrategy
AFAIK. En ce qui concerne l'écriture de code spécial pour gérer l'actualisation avec LocationStrategy, vous ne savez pas ce que vous voulez dire exactement. Demandez-vous, que se passe-t-il si mon "href de base" change pendant une activité dans mon application? Ensuite, oui, j'ai dû faire quelque chose de sale commewindow.location.href = '/' + newBaseHref;
là où il fallait le changer. Je n'en suis pas trop fier. Aussi, pour faire une mise à jour, je me suis éloigné de ces solutions de piratage dans mon application car cela devenait un problème de conception pour moi. Les paramètres du routeur fonctionnent parfaitement bien, je me suis donc tenu à cela.appRoutingProvider
air, Krishnan? Je vois que la réponse acceptée est la même; peut-être que vous venez de copier le sienproviders
, mais sinon, pouvez-vous me donner un échantillon ou décrire son objectif? La documentation ne fait queimports
des modules de routage , elle n'utilise aucun fournisseur lié au routage (pour autant que je sache)location /subfolder/myapp/ { try_files $uri /subfolder/myapp/index.html; } location /subfolder2/myapp/ { try_files $uri /subfolder2/myapp/index.html; }
J'utilise le répertoire de travail actuel
./
lors de la création de plusieurs applications sur le même domaine:Sur une note latérale, j'utilise
.htaccess
pour aider à mon routage lors du rechargement de la page:la source
.htaccess
fichier<base href="./">
est faux et va se foutre avec des itinéraires comme en/app/a/b/c
effet, je viens de le tester. Préférez définir vous-même le href de base s'il s'agit uniquement d'une application Web ou jetez un œil à la manière angulaire de changer le href de base lors du déploiement (il y a beaucoup de réponses ici mentionnant cela).Simplification de la réponse existante par @sharpmachine .
Vous n'êtes pas obligé de spécifier une balise de base dans votre index.html, si vous fournissez une valeur pour le jeton opaque APP_BASE_HREF.
la source
Cela fonctionne bien pour moi dans un environnement de production
la source
Dans angular4, vous pouvez également configurer baseHref dans les applications .angular-cli.json.
dans .angular-cli.json
cela mettra à jour le href de base dans index.html en MY_APP_BASE_HREF_1
la source
Si vous utilisez Angular CLI 6, vous pouvez utiliser les options deployUrl / baseHref dans angular.json (projets> xxx> architect> build> configurations> production). De cette façon, vous pouvez facilement spécifier la baseUrl par projet.
Vérifiez que vos paramètres sont corrects en consultant l'index.html de l'application créée.
la source
Add-ons: Si vous voulez par exemple: / users comme base d'application pour le routeur et / public comme base pour l'utilisation des actifs
la source
Eu un problème similaire, en fait, j'ai fini par sonder l'existence d'un fichier dans mon site Web.
probePath serait l'URL relative du fichier que vous souhaitez vérifier (sorte de marqueur si vous êtes maintenant au bon emplacement), par exemple 'assets / images / thisImageAlwaysExists.png'
la source
Dans package.json, définissez l'indicateur --base-href sur le chemin relatif:
la source
Franchement, votre cas fonctionne bien pour moi!
J'utilise Angular 5.
la source
J'ai juste changé:
pour ça:
n'oubliez pas de terminer par /
la source