J'ai simple application angular2-cli (une page avec la forme pilotée par le modèle - pas de routeur impliqué). Avec "ng servir" tout fonctionne bien. J'ai fabriqué la version de production avec ng build --product. J'ai copié tout le contenu du dossier ./dist dans un nouveau dossier sous C:\inetpub\wwwroot. J'ai créé une application virtuelle à partir de la console de gestion IIS. Le fichier de l'application Defualt est index.html. Je navigue sur l'application uri et je n'ai qu'une page avec "Chargement en cours ...". J'essaie de construire sans --product switch (seulement ng build) mais le résultat est le même. L'application angulaire ne se charge pas. Y at-il autre chose nécessaire pour publier l'application angulaire sur IIS?
Voici comment je résous cette situation.
ng build
dist
base href
dans votre index.html de /
à /yourAliasNameOnIIS
Utilisez ce fichier web.config pour rediriger les demandes vers votre page index.html
<system.webServer>
<rewrite>
<rules>
<rule name="AngularJS Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
</conditions>
<action type="Rewrite" url="/yourAliasNameOnIIS" />
</rule>
</rules>
</rewrite>
Convertissez votre répertoire virtuel en une application Web
Vous pouvez également utiliser ng build --deploy-url "/yourAliasNameOnIIS"
pour modifier le chemin src dans dist/index.html
.
J'espère que ça aide!
Lorsque vous ouvrez les outils de développement de votre navigateur, vous auriez vu 404 messages lorsque l'application tentait de télécharger les fichiers js, css, etc.
Vous devez définir la base href dans index.html sur
<base href="./">
cela garantira que la référence de base est relative à l'emplacement de votre site Web dans IIS . Vous devez également utiliser une stratégie d'emplacement de hachage, sinon, IIS interceptera les modifications de l'URL de votre routeur ng2 et tentera de trouver un contrôleur/une action pour l'URL.
sous les importations de votre app.module.ts:
RouterModule.forRoot(routerConfig, { useHash: true })
J'ai effectué ces 2 étapes et tout fonctionne parfaitement sur Azure VM avec IIS. Cela signifie également que vous n'avez pas besoin de placer votre SPA sur la racine et que vous pouvez avoir plusieurs SPA qui fonctionnent joyeusement l'un à côté de l'autre (sur différents sites Web sur IIS).
Pour moi, c'était très simple:
Cela simplifie encore les choses, vous n'avez pas besoin de modifier le fichier index.html:
ng build -prod --base-href
J'ai essayé l'approche ci-dessous cela a fonctionné.
J'ai renvoyé de nombreuses suggestions, ce qui a fonctionné pour moi était ce link
Une bonne explication pour expliquer pourquoi les choses doivent être configurées de manière différente pour une application Angular est clairement décrite ici. Suivez les étapes du lien, puis j’ai ajouté un fichier web.config dans l’emplacement du dossier des fichiers publiés avec les paramètres ci-dessous:
<?xml version="1.0"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="AngularJS Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Les paramètres sont également décrits dans le lien ci-dessus . J'espère que cela aidera quelqu'un.
pour ceux qui utilisent angular i18n, vous devez créer l'application pour chaque langue et les mettre dans des dossiers distincts
ng build --output-path=dist/fr --prod --bh /fr/
ng build --output-path=dist/en --prod --bh /en/
et voici la config pour iis
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<directoryBrowse enabled="true" />
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^../index\.html$" ignoreCase="false" />
<action type="None" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="(..)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}/index.html" />
</rule>
<rule name="Imported Rule 3">
<match url="^$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^fr" />
</conditions>
<action type="Redirect" url="/fr/" redirectType="Found" />
</rule>
<rule name="Imported Rule 5">
<match url="^$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^es" negate="true" />
</conditions>
<action type="Redirect" url="/en/" redirectType="Found" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
En plus de la réponse d'ulubeyn qui fonctionnait principalement pour moi, j'ai ajouté mes propres règles de réécriture IIS pour permettre:
1) la redirection initiale de/dist vers alias 2) Javascript télécharge à partir d'alias et 3) Routage angulaire sur l'alias
<rules>
<rule name="Redirect from blank URL to IIS Alias" stopProcessing="true">
<match url="^/?$" />
<action type="Rewrite" url="/MyDist" />
</rule>
<rule name="Redirect from /dist folder to IIS Alias" stopProcessing="true">
<match url="^(.*)/dist" />
<action type="Rewrite" url="/yourAliasNameOnIIS" />
</rule>
<rule name="Allow Angular URL Routing on IIS Alias" stopProcessing="true">
<match url="^yourAliasNameOnIIS/*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
</conditions>
<action type="Rewrite" url="/yourAliasNameOnIIS" />
</rule>
<rule name="Redirect to IIS Alias folder with parameters" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
</conditions>
<action type="Rewrite" url="/yourAliasNameOnIIS/{R:1}" appendQueryString="true" />
</rule>
</rules>
ajoutez le fichier web.config à l'emplacement app/src / contenu de web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Angular Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="./index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
dans .angular-cli.json, ajoutez Web.config à la section Actifs comme suit:
"assets": [
"assets",
"favicon.ico",
"web.config"
],
Vous pouvez le déployer sans aucun fichier Web.config comme ci-dessous,
Vous pouvez trouver index.html
dans le dossier dist à l'intérieur de celui-ci trouver la balise base href
maintenant changer son chemin en conséquence
Ex -: si déployé dans wwwroot
<base href="/">
Ex: si vous déployez dans un dossier dans wwwroot
<base href="/FolderName/">