我正在使用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
,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),然后通过路由器进行分派(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/