angular8 - 子目录中的 Angular 8 路由器
问题描述
我正在研究 Angular 8 项目,我必须将它放在服务器上的子目录中。在 index.html 上我有<base href="/subdirectory/">
并且在 app-routing 上
{
path: '',
component: HomeComponent
},
{
path: 'aaa/:id/:lang',
component: FirstStoryComponent
},
{
path: 'bbb/:id/:lang',
component: SecondStoryComponent
},
网址http://www.testurl.com/subdirectory/aaa/46/en
如果我首先从 HomeComponent 开始并使用按钮或<a></a>
标签等内部链接,我可以在组件之间导航。但是,如果我从另一个网站创建一个链接以使用参数直接导航到 FirstStoryComponent。url,一模一样的url,会马上消失,页面加载不出来,好像url不正确或者页面没有接收到参数一样。这是激活路由
this.actRoute.params.subscribe(
(params: Params) => {
this.ID = +params['id'];
this.lang = params['lang'];
}
);
我也试过
this.ID = +this.actRoute.snapshot.params['id'];
我需要能够从另一个网站链接。
有人可以给我一些指导吗?
谢谢你。
解决方案
Angular 应用程序的基本规则(就像每个单页应用程序一样)是:
服务器必须配置为提供 index.html 而不是 404 页面,在每种情况下都会请求服务器不知道的 url,以便 Angular 的路由器可以处理正确的路由(请参阅下面的解释)。
具体如何实现取决于您的服务器类型,超出了本课程的范围。请查看官方文档的这篇文章(或为您的个人服务器获取有关 stackoverflow 的帮助)...
→ https://angular.io/guide/deployment#server-configuration
...以及此处的Academind文章...
→ https://academind.com/learn/angular/angular-qa/#how-to-fix-broken-routes-after-deployment
ng serve 自动执行此操作,对于本地测试,我已经全局安装了 http-server-spa (npm i -g http-server-spa),以便通过运行 http-server-spa dist/ 轻松提供 dist 文件夹中的内容在项目内部(在根级别,如 ng serve)。
要在本地测试构建的项目,您可以使用 http-server-spa:
使用 npm i http-server-spa 安装它。
然后使用 http-server-spa dist/ 提供构建的应用程序
在单页应用程序中,服务器仅在开始时提供一些静态文件(几乎为空的 index.html 和一些 js 包)。一切,包括路由,都必须在浏览器中进行管理。
因此,如果服务器收到对 my-domain.com/something 的请求,它总是必须为 index.html 提供服务(因为服务器不知道任何其他 html 文件,并且重定向到 404 页面在在这种情况下,从那时起根本不会提供应用程序)。然后 Angular 路由器(加载了附加到 index.html 的包)可以修改 index.html 以使用户可以看到 /something 内容。被重定向到 Angular 应用程序的“未找到”组件。
这不是 Angular 特有的,但如果您使用 history.pushState 在 SPA 中手动实现路由,这将是相同的原理。
Udemy Angular The Complete Guide的Jost Schmithals给了我这个建议
在这个论坛上进行了一些搜索后,我找到了答案。
我必须把它放在我的 .htaccess 子目录中,现在它可以工作了。
RewriteEngine on
# Don't rewrite files or directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# Rewrite everything else to index.html
# to allow html5 state links
RewriteRule ^ index.html [L]
推荐阅读
- kubernetes - 使用 Deployment Manager 部署区域私有 GKE 集群时出错
- scala - 通用高级类型
- javascript - AngularJS Ng-Repeat 仅在子子行上
- python - Django 请求会话无法读取 django-session 表
- c# - 运行 Ranorex/Neoload 测试时未找到 [ProtocolSAPGUI] 的属性或关联
- javascript - 单击选项时如何关闭菜单?简单的 JS,但我不能这样做:/
- python - 无列表逐行比较 2 个文件
- java - 从Java中的字符串中删除不可打印的字符
- frama-c - Frama-C:在命令行输出中显示调用堆栈
- c# - 以编程方式完成条件业务流程时抛出异常