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

Jas*_*son 5 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.
Run Code Online (Sandbox Code Playgroud)

我该如何映射www.domain.com/pagewww.domain.com/#page

小智 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"});
}
Run Code Online (Sandbox Code Playgroud)

基本上,我们告诉服务器忽略任何以下开头的请求:

  • API /
  • 微风/
  • 应用程序/
  • 脚本/
  • 内容/
  • 资产/
  • signalr /

我们忽略了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' })
Run Code Online (Sandbox Code Playgroud)


Jam*_*ond 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 });
Run Code Online (Sandbox Code Playgroud)

您可以在我的网站上看到一个工作示例:noadou