如何通过在部署的应用程序中重写URL使Angular 2路由器工作?

如何通过在部署的应用程序中重写URL使Angular 2路由器工作?,angular,angular2-routing,Angular,Angular2 Routing,我现在正在完成Angular 2应用程序,我想知道如何托管它 我刚刚尝试在我的本地主机上构建应用程序,事实上,除了应用程序的路由器,一切都正常。我无法通过重写URL来访问路由,因为它可能正在查找某些文件和.htaccess重写规则,而不是路由。对我来说,能够通过重写URL访问路由是很重要的,因为我不想让我的管理面板和其他一些东西公开(被视为超链接) 更具体地说。。。 当我访问http://localhost/FinalApp/它使用路由器将我导航到http://localhost/FinalAp

我现在正在完成Angular 2应用程序,我想知道如何托管它

我刚刚尝试在我的本地主机上构建应用程序,事实上,除了应用程序的
路由器
,一切都正常。我无法通过重写URL来访问路由,因为它可能正在查找某些文件和.htaccess重写规则,而不是
路由
。对我来说,能够通过重写URL访问路由是很重要的,因为我不想让我的管理面板和其他一些东西公开(被视为超链接)

更具体地说。。。 当我访问
http://localhost/FinalApp/
它使用路由器将我导航到
http://localhost/FinalApp/list/page/1
因此,
列表/页面/1
由Angular 2路由器添加。所有
[routerLink]
都工作正常,请将我导航到例如
http://localhost/FinalAll/list/category/3
当我单击它们时,但当我手动重写URL以进入管理面板时(我正在将
admin
添加到我的基础
http://localhost/FinalApp/
,因此最终的URL看起来像
http://localhost/FinalApp/admin
)它向我显示404错误(不是路由器的默认路由,而是服务器端404)

我想能够手动重写的网址和使用Angular 2路由器


我是遗漏了什么还是根本不可能?

这个问题可以通过实现
HashLocationStrategy
来解决,它将
添加到所有路由:
http://localhost/FinalApp/list/page/1
变为
http://localhost/#/FinalApp/list/page/1
。您可以通过添加
HashLocationStrategy
来实现这一点>要
AppModule
提供程序:

{ provide: LocationStrategy, useClass: HashLocationStrategy }
您需要从
@angular/common
导入
LocationStrategy
HashLocationStrategy

import { LocationStrategy, HashLocationStrategy } from '@angular/common';
如果您使用的是RC4或更低版本,请将其添加到
引导方法中:

bootstrap(
AppComponent,
    [
        { provide: LocationStrategy, useClass: HashLocationStrategy }
    ]);

正如您所说,这是由于服务器端路由。使用链接href,浏览器向您的应用程序所在的服务器发出请求。如果您尚未将web服务器设置为将所需路径路由到单页应用程序,它将在系统中查找存储在
http://localhost/FinalApp/admin
。如果您使用url重写来维护浏览器中的url,但为应用程序提供服务时,应用程序将在加载后执行所有路由。以下是一个简单且未经测试的示例:

使用apache重写的示例

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(/.*)$ /index.html [L]

这是一个解决方案,但可以保留“HTML5URL”在
.htaccess
文件中进行了一些配置。很好。谢谢你,工作得很好。你现在不知道是否有办法通过.htaccess或类似的方式从URL隐藏“#”吗?@DawidZbiński说实话,我知道有一种方法可以不添加
,但我从未尝试过。也许@NoémiSalaün可以教我们一些新的东西,我会很感激。:-)我还没有使用纯HTML5URL。很抱歉我知道有办法,但我不能再说了:/@NoémiSalaün Nevermind,我会尝试用谷歌搜索一些东西。如果我发现了什么,我可以让你知道……你的
index.html中可以有
,所以你不需要重写URL