2010-09-21 54 views
3

因此,我的Web应用程序中的所有页面都有URI形式http://www.example.com/#some-hash等。但是,当然,如果用户访问http://www.example.com/some-hash,他们应该重定向并以其通常的荣耀体验该网站。重定向到URI的散列版本的最佳方法是什么?

好的,没问题吧?只需编写一些全局的HTTP请求拦截器,可以将任何事情自动重定向到散列版本。

但是这完全不是那么回事,因为参观http://www.example.com/#some-hash的想法是,“框架”页面(即http://www.example.com/),然后Ajax的负载http://www.example.com/some-hash到它的内部框架。所以当这个Ajax发生时,上面提到的简单解决方案会陷入无限循环,因为至少应该允许Ajax请求获得未经哈希的版本。

现在我有一个不能令人满意的解决方案,我所有的“子页面”包括

if (window.location.pathname != "/") 
{ 
    window.location.href = window.location.protocol + "//" + window.location.host + "/#" + window.location.pathname.substring(1); 
} 

最大的问题,除了重复代码(这是通过使用脚本组合框架有所减轻),是当用户访问http://www.example.com/some-hash时,页面的丑陋无格式,非脚本版本需要一两秒钟才能加载,并且只有,然后才会重定向JavaScript。不好玩!

所以我正在寻找更好的解决方案。服务器端我们正在研究ASP.NET MVC 2,但这有点不可知论。可能类似于,在使用Ajax时将“?framed = true”附加到请求中,然后在非查询字符串被指示的查询字符串中没有framed = true的情况下执行服务器端重定向?我对你如何解决这个问题感兴趣。

回答

2

您可能需要考虑服务器端URL重写解决方案。这是否合适取决于对你的站点和基础设施的更多了解,但是通常mod_rewrite(或者你选择的服务器上的相应设备)等模块可以很好地处理你的“somehash”和“#somehash”变种描述。

http://httpd.apache.org/docs/current/mod/mod_rewrite.html(手动) http://httpd.apache.org/docs/2.0/misc/rewriteguide.html(例子)

+0

这是否地址我的第三段的问题?因为据我所知,这是我在第二段中概述的天真解决方案之一,并立即解释了为什么它不起作用。 – Domenic 2010-09-21 21:08:58

+0

我认为会的。 我基本上以类似于你在最后一段中描述的方式来解决它。 (对不起,在我第一次阅读时,我错过了那篇文章中的服务器端注释。)让您的应用程序生成服务器可以适当重定向的Ajax URL。 也许更基本的问题是你是否真的需要这个somehash /#somehash关系?您是否需要保留一些需要保持等效的URL?如果没有,那么我会重新构造东西,以便内部框架URL永远不会被用户看到。 – LVB 2010-09-22 00:36:11

相关问题