因此,我的Web应用程序中的所有页面都具有http://www.example.com/#some-hash形式的URI等。但是,当然,如果用户访问http://www.example.com/some-hash,他们应该被重定向并以通常的荣耀体验网站。
好的,没问题,对吗?只需编写某种全局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时执行服务器端重定向?我对你如何解决这个问题感兴趣。
答案 0 :(得分: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(例子)