Durandal JS:输入没有哈希的URL给出HTTP错误404.0 - 未找到

时间:2014-03-20 06:02:39

标签: hash http-status-code-404 durandal

我正在使用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

2 个答案:

答案 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 /
  • 微风/
  • 应用程序/
  • 脚本/
  • 内容/
  • 资产/
  • signalr /

我们忽略了apibreezesinglar,因为WEBApi和SignalR将处理这些请求。另外,appscriptscontentassets会被忽略,因为底层的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