Angular 在本地工作的远程服务器上路由失败
Angular routing fails on remote server working locally
我有一个非常简单的项目,具有以下路由。
const routes: Routes = [
{ path: "start", component: StartComponent },
{ path: "sub01", component: Sub01Component },
{ path: "", redirectTo: "/start", pathMatch: "full" },
{ path: "**", component: StartComponent }
];
当我 运行 在本地使用 ng serve
并浏览到 localhost:4200 时,我可以看到起始页面的内容和 URL 被重写为 localhost:4200/start,正如预期的那样。然后,我通过 ng build 制作了一个半定稿,并放在我的 IIS 上的 dist 目录中。浏览到应用程序的地址会产生与上述相同的结果。我还可以确认浏览到例如图片的 URLs 也产生了预期的结果。
正如我注意到的,不同之处在于,在本地,它可以重新加载页面(即浏览到 localhost:4200/start),而在远程上的相同操作失败,给我 404(因此无法浏览 http://address.that-worked-just.now/start)。由于我可以访问其他 URL 而不仅仅是根,所以在我看来,它只是路由不起作用。
我对这种行为感到有点吃惊,不确定如何进一步诊断它。我知道的唯一区别是在本地,我使用默认的 Angular CLI 为应用程序提供服务,而在远程,我有 IIS 服务 index.html 包含脚本。所以我认为,一旦向客户生成了文档,其他所有事情都发生在客户身上。 (该应用程序真的很有限,没有与服务器的交互,没有服务等,因为它基本上是一个登陆页面,至少现在是这样)。
我是否遗漏了应该在任何配置文件中声明的内容?还是由于某些防火墙策略等原因可能会发生奇怪的不当行为?我不确定如何确定这一点,我宁愿假设我做了一些愚蠢的事情而不是责怪服务器团队。综上所述,还可以推断出什么?
IIS 有自己的路由系统。所以当我们在 IIS 中托管 Angular 时,Angular 路由将失败,因为 IIS 不理解 Angular 路由并且会寻找与路由匹配的资源并且它给你404 错误。
要解决此问题,您可以尝试以下解决方案之一:
使用IIS URL重写规则设置路由:
<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>
来源:https://angular.io/guide/deployment#fallback-configuration-examples
另一种方法是添加404的错误页面重定向到/index.html.
我有一个非常简单的项目,具有以下路由。
const routes: Routes = [
{ path: "start", component: StartComponent },
{ path: "sub01", component: Sub01Component },
{ path: "", redirectTo: "/start", pathMatch: "full" },
{ path: "**", component: StartComponent }
];
当我 运行 在本地使用 ng serve
并浏览到 localhost:4200 时,我可以看到起始页面的内容和 URL 被重写为 localhost:4200/start,正如预期的那样。然后,我通过 ng build 制作了一个半定稿,并放在我的 IIS 上的 dist 目录中。浏览到应用程序的地址会产生与上述相同的结果。我还可以确认浏览到例如图片的 URLs 也产生了预期的结果。
正如我注意到的,不同之处在于,在本地,它可以重新加载页面(即浏览到 localhost:4200/start),而在远程上的相同操作失败,给我 404(因此无法浏览 http://address.that-worked-just.now/start)。由于我可以访问其他 URL 而不仅仅是根,所以在我看来,它只是路由不起作用。
我对这种行为感到有点吃惊,不确定如何进一步诊断它。我知道的唯一区别是在本地,我使用默认的 Angular CLI 为应用程序提供服务,而在远程,我有 IIS 服务 index.html 包含脚本。所以我认为,一旦向客户生成了文档,其他所有事情都发生在客户身上。 (该应用程序真的很有限,没有与服务器的交互,没有服务等,因为它基本上是一个登陆页面,至少现在是这样)。
我是否遗漏了应该在任何配置文件中声明的内容?还是由于某些防火墙策略等原因可能会发生奇怪的不当行为?我不确定如何确定这一点,我宁愿假设我做了一些愚蠢的事情而不是责怪服务器团队。综上所述,还可以推断出什么?
IIS 有自己的路由系统。所以当我们在 IIS 中托管 Angular 时,Angular 路由将失败,因为 IIS 不理解 Angular 路由并且会寻找与路由匹配的资源并且它给你404 错误。
要解决此问题,您可以尝试以下解决方案之一:
使用IIS URL重写规则设置路由:
<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>
来源:https://angular.io/guide/deployment#fallback-configuration-examples
另一种方法是添加404的错误页面重定向到/index.html.