使用 AngularJS SPA 的服务器端路由

Posted

技术标签:

【中文标题】使用 AngularJS SPA 的服务器端路由【英文标题】:Server-side routing with an AngularJS SPA 【发布时间】:2015-04-18 10:54:10 【问题描述】:

我正在使用 ASP.NET MVC、IIS 8,并且我正在使用 AngularJS 创建一个 SPA。我只在我的 MVC 应用程序中定义了这个路由规则,它指向我的 SPA 所在的 Home 控制器中的 Index 方法:

routes.MapRoute(
    name: "DefaultHome",
    url: "",
    defaults: new  controller = "Home", action = "Index" 
);

现在我有一堆客户端 SPA 路由,我希望所有这些路由都可以在没有 hashbang 前缀 #/ 的情况下使用。 html5Mode 完美运行 - 但仅在加载应用时。如果我复制 URL,关闭窗口,打开窗口并将其粘贴,我会收到 IIS 404 错误。这是有道理的,因为路由是在服务器上完成的。

所以共享 URL 不起作用,我希望能够这样做。所以路由也必须在服务器端完成,但是每次我更改路由(添加客户端路由)时,我都不想创建服务器端路由规则。

一般情况下可以这样做吗?就像 URL 将 /* 重写为 #/* 而不重定向用户的东西? /Static 除外。

【问题讨论】:

【参考方案1】:

只需将网址更改为"*catchall"。像这样:

routes.MapRoute(
    name: "DefaultHome",
    url: "*catchall",
    defaults: new  controller ="Home", action= "Index" 
);

【讨论】:

我不确定这是否可行。如果我创建一个客户端路由http://server/#/some/cool/route,我希望它可以通过http://server/some/cool/route 使用。会这样吗? 当我尝试这个时发生了一些奇怪的事情。视图被加载两次,一次作为 MVC 中的母版页,一次在 UI-Router 的 <ui-view>

以上是关于使用 AngularJS SPA 的服务器端路由的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS:路由

如何使用 AngularJs 处理 Laravel 路由?

AngularJS SPA 需要重新加载以识别 localstorage 中的 jwt 令牌

AngularJS 路由

单页面应用路由的实现方式

Angularjs路由与django的网址