我正在与Jekyll建立一个简单的营销网站,并在幕后使用Backbone的路由和历史来处理导航。我网站的每个页面都是自己的HTML文件,我的策略是preventDefault()
在页面之间的链接上,触发jQuery.get()
以获取新的HTML,并将我的div.content
替换为来自新页面的信息。
我知道这个设置有点不寻常,但我有我的理由:单页结构更可取,因为我想要精确控制页面转换,我想避免每次用户导航时都要求我的webfonts到一个新的页面。保持HTML文件的静态和分离也是搜索引擎的一个胜利。
以下是问题:当我从根网址开始时,一切正常,但是当我从不同的网页开始时,例如mydomain.com/page1
,历史崩溃了。在初始化期间,我的路由器尝试将我路由到我已经在的页面,产生404:Could not GET mydomain.com/page1/page1
。我可以使用hacky isFirstLoad
布尔值来防止这种情况,但这显然很糟糕,当我开始点击并使用后退按钮返回/page1
时,它不会中断。
我认识到一种解决方案是编写一些服务器端逻辑,为我的index.html
提供服务,无论遇到什么URL。但是,我不知道如何做到这一点,特别是对于当地环境。它是关于PHP还是.htaccess?这甚至是我必须做的事情吗?我是不是完全走错了路?
谢谢!
答案 0 :(得分:1)
是的,一个解决方案是使用index.html
为每个请求提供服务。但这有一个很大的缺点:搜索引擎无法访问您的网站。为了保持拥有静态网站的SEO优势,我建议你回避这个选择。
我认为Backbone已经提供了最佳解决方案。来自their documentation:
如果服务器已经渲染了整个页面,并且您不希望在启动历史记录时触发初始路由,请传递
silent: true
。
因此,首先要确保路由器配置正确,所有路由都与静态页面匹配,然后实例化路由器。
然后,像这样开始历史:
Backbone.history.start({ pushState: true, silent: true, root: '/' });
推送状态有助于保持网址友好。 Silent标志告诉Backbone你的静态服务器已经提供了页面,它只是在事后(你想要的)加载。 Root配置可确保Backbone知道您网站的真正根源(因此您无法获得page1/page1
废话。
根据我的经验,正确设置路由可能会有点变幻无常......祝你好运!