Jekyll静态页面的主干路由/历史问题

时间:2014-07-03 16:40:27

标签: javascript .htaccess backbone.js history jekyll

我正在与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?这甚至是我必须做的事情吗?我是不是完全走错了路?

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,一个解决方案是使用index.html为每个请求提供服务。但这有一个很大的缺点:搜索引擎无法访问您的网站。为了保持拥有静态网站的SEO优势,我建议你回避这个选择。

我认为Backbone已经提供了最佳解决方案。来自their documentation

  

如果服务器已经渲染了整个页面,并且您不希望在启动历史记录时触发初始路由,请传递silent: true

因此,首先要确保路由器配置正确,所有路由都与静态页面匹配,然后实例化路由器。

然后,像这样开始历史:

Backbone.history.start({ pushState: true, silent: true, root: '/' });

推送状态有助于保持网址友好。 Silent标志告诉Backbone你的静态服务器已经提供了页面,它只是在事后(你想要的)加载。 Root配置可确保Backbone知道您网站的真正根源(因此您无法获得page1/page1废话。

根据我的经验,正确设置路由可能会有点变幻无常......祝你好运!