【问题标题】:Why when i refresh an angular application results to 404 Not Found?为什么当我将 Angular 应用程序结果刷新为 404 Not Found 时?
【发布时间】:2021-08-17 08:32:18
【问题描述】:

我正在开发一个 Angular 应用程序并将其部署在 kubernetes 中。我可以通过 Nginx Ingress 访问我的应用程序。

我正在使用角度路由器来启用通过我的应用程序中不同组件的导航。

使用已部署的应用程序,我尝试浏览不同的组件,当我在浏览器上单击刷新或直接访问特定的 url 路径时,我得到 404 Not Found Page。

例如,如果访问 URL mycompany.domain.com,它会显示 home 组件。在我的角度路由器中,我有一个指向用户组件的/user 路径。

导航到用户菜单后,我的新 URL 现在将是 mycompany.domain.com/user - 一切正常。 但是如果我刷新当前页面,它会变成404 Not Found Page,这就是问题所在。

我的一些想法:

  1. 路由器是 SPA 的一部分,当然会在 SPA 加载后加载。
  2. /user 的 url 路径只有 SPA 中的路由器知道 - 因此当我们尝试直接访问 mycompany.domain.com/user 时,服务器找不到任何与之匹配的资源。
  3. 唯一能理解/user url 路径的是我的SPA - 因为服务器已经确定找不到资源,所以它还没有加载。

因此,我得出结论(但仍要尝试),无论我的入口或服务器配置,我部署 SPA 的任何地方都可能出现问题。

我的解决方案正在使用角度路由器 useHash 选项 - 这意味着我的导航路径将在 # 之后并被视为 URL 片段,如下所示:mycompany.domain.com/#/用户,在这种情况下,我的服务器不会尝试理解该片段,因为它应该被页面理解。我这样做是受到 Vue.js 路由器的启发。

我的问题是:

  1. 我的理解(和结论)是否正确?
  2. 还有其他解决方案吗?因为 Angular 默认不使用哈希值,我确信这是有原因的,因为如果它在部署时不起作用,它就没有意义?
  3. URL 重写可以帮助我吗?我自己尝试寻找它的用法与我的结论不符。

我不是 SPA 专家,我才刚刚开始,如果有人能纠正并回答我,我将不胜感激。

【问题讨论】:

  • 你的 nginx 配置是什么样的?
  • 我的第一个猜测是您需要在 Kubernetes 或 nginx 中设置重定向,并将所有路由重定向到 index.html,然后您的 Angular 应用程序可以处理路由。除非有这些重定向规则,否则当路由更改时,服务器不知道要为哪个文件提供服务。我不知道如何在 Kubernetes 或 nginx 上设置它。我认为您的所有假设都是正确的,但我不鼓励您使用哈希路由。哈希路由无需设置重定向规则即可工作。
  • @John,我可以知道为什么不鼓励使用哈希路由吗?我看到另一个路由叫做浏览器路由,需要在服务器上进行特定的配置才能使浏览器路由成功。
  • @eko,请注意,当我提到 nginx 时,我使用的是 nginx 入口控制器来公开我的 kubernetes 应用程序,尽管我使用嵌入式 tomcat 服务器将我的 angular 应用程序托管在 springboot 应用程序上。但是当我们使用 httpd 服务器时问题也很明显——我们获取了一个 httpd 服务器镜像,复制 dist 文件夹然后运行镜像——所以我可以说,我们只使用默认服务器配置。
  • 也许这只是个人意见,但我认为创建对机器人的支持更加困难(例如,如果我们分享它,让第三方应用程序根据 url 显示特定的元数据和图像SNS 或类似网站。)

标签: angular nginx kubernetes


【解决方案1】:

将此代码另存为 web.config,然后将 web.config 文件粘贴到 dist 文件夹中

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation targetFramework="4.0" />
    <customErrors mode="On" redirectMode="ResponseRewrite">
      <error statusCode="404" redirect="/index.html" />
    </customErrors>
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="404"/>
      <error statusCode="404" path="/index.html" responseMode="ExecuteURL"/>
    </httpErrors>
  </system.webServer>
</configuration>

【讨论】:

  • 是什么样的配置?任何服务器都可以理解吗?另外,在我看来,我们只是将 404 重定向到 /index.html,所以在这种情况下,我们丢失了 url 路径?
  • 这不是重定向而是重写。所以如果 /user 被请求,服务器应该首先检查它是否有一个文件夹或文件在服务器上,如果有,提供那个,否则,提供 index.html 的内容
  • 它可以与我部署我的应用程序的任何服务器一起使用吗?所以一旦它提供了 index.html 的内容,我的 /user url 路径会发生什么?
  • 我希望它能在任何服务器上工作。当您重新加载或刷新 url 时,它会自动获取您的 /user url 路径。
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 2023-02-02
  • 2023-01-05
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多