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

最佳答案

为了使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/
  • 微风/
  • 应用程式/
  • 脚本/
  • 内容/
  • Assets /
  • 信号器/

  • 我们将忽略apibreezesinglar,因为WEBApi和SignalR将处理这些请求。另外,appscriptscontentassets也会被忽略,因为底层的ASP.NET引擎将为这些请求提供服务。

    最后一条语句(routes.MapRoute)使所有不可忽略的请求发送回默认页面(SPA中唯一的真实页面)。

    例如,www.domain.com/page将从服务器发送相同的响应,就像您要求www.domain.com/一样。一旦SPA加载并且Durandal的router/history已初始化,则后缀将根据需要转换为哈希值(例如,您正在使用IE),然后通过路由器进行分派(dispatch)。

    请注意,如果您的应用程序不是基于/,则需要指定根路径。您还应该包括hashChange: true,以便您的应用程序可以在IE中运行,如下所示:

    router.activate({ pushState: true, hashChange: true, root: '/approot' })
    

    关于hash - Durandal JS : typing url without hash give HTTP Error 404. 0-找不到,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22524667/

    10-11 11:32