我正在使用Durandaljs构建SPA应用程序。当我输入一个没有哈希的URL时,它显示错误:HTTP error 404.0 - NOT FOUND.
但是,它正常工作与哈希。
示例:
www.domain.com/page => HTTP error 404.0 - NOT FOUND
www.domain.com/#page = > working fine.
如何将www.domain.com/page
映射到www.domain.com/#page
?
答案 0 :(得分:6)
为了使pushState
在您的应用中正常运行(包括深层链接),您必须为pushState配置路由器和告诉服务器忽略除特定路径/路由之外的所有路径。
服务器应忽略包含SPA使用的资源或服务的路径,并应始终为这些被忽略的路由发送Durandal.cshtml
(或其他任何名称)。
即使请求中有其他路由信息,也应忽略这些路由。这将允许使用pushState样式的URL进行深层链接。
这是我最近完成的基于Durandal的应用程序的MVC路由:
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Ignore("{resourcedir}/{*resource}",
new {resourcedir = @"(api|breeze|app|scripts|content|assets|signalr)"});
routes.MapRoute(
name: "Default",
url: "{*sparoute}",
defaults: new { controller = "Durandal", action = "Index"});
}
基本上,我们告诉服务器忽略任何以:
开头的请求我们忽略了api
,breeze
和singlar
,因为WEBApi和SignalR将处理这些请求。另外,app
,scripts
,content
和assets
会被忽略,因为底层的ASP.NET引擎会为这些请求提供服务。
最终语句(routes.MapRoute
)会导致所有未被忽略的请求发送回默认页面(SPA中唯一的真实页面)。
例如,www.domain.com/page
将从服务器发送相同的响应,就像您要求www.domain.com/
一样。一旦SPA加载并且Durandal的router/history
已初始化,后缀将根据需要转换为哈希(就像您正在使用IE),然后通过路由器发送。
请注意,如果您的应用程序未以/
为根,则需要指定根路径。您还应该包含hashChange: true
,以便您的应用程序在IE中运行,如下所示:
router.activate({ pushState: true, hashChange: true, root: '/approot' })
答案 1 :(得分:3)
您可以,我在最新的Durandal网站上使用它,该网站基于DurandalAuth模板。
初始化路由器时,请设置pushState: true
,如下所示:
return router.map([
{ route: 'somroute', moduleId: 'somroute', title: 'Home', nav: true, hash: "#somroute" }
])
.buildNavigationModel()
.mapUnknownRoutes("notfound", "notfound")
.activate({ pushState: true });
您可以在我的网站上看到一个有效的示例:noadou