【发布时间】: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,这就是问题所在。
我的一些想法:
- 路由器是 SPA 的一部分,当然会在 SPA 加载后加载。
-
/user的 url 路径只有 SPA 中的路由器知道 - 因此当我们尝试直接访问 mycompany.domain.com/user 时,服务器找不到任何与之匹配的资源。 - 唯一能理解
/userurl 路径的是我的SPA - 因为服务器已经确定找不到资源,所以它还没有加载。
因此,我得出结论(但仍要尝试),无论我的入口或服务器配置,我部署 SPA 的任何地方都可能出现问题。
我的解决方案正在使用角度路由器 useHash 选项 - 这意味着我的导航路径将在 # 之后并被视为 URL 片段,如下所示:mycompany.domain.com/#/用户,在这种情况下,我的服务器不会尝试理解该片段,因为它应该被页面理解。我这样做是受到 Vue.js 路由器的启发。
我的问题是:
- 我的理解(和结论)是否正确?
- 还有其他解决方案吗?因为 Angular 默认不使用哈希值,我确信这是有原因的,因为如果它在部署时不起作用,它就没有意义?
- 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