使用Backbone pushState和Slim Framework使Nginx正常工作

时间:2013-12-15 22:45:05

标签: backbone.js nginx slim pushstate

首次使用Backbone的pushState并且没有100%正常工作,所以请帮助我们。我的需求是:

  1. 必须使用深度嵌套的网址,并从默认路由
  2. 导航到这些网址
  3. 直接链接(或页面刷新)到深层嵌套的URL
  4. 必须能够通过Backbone sync正确调用我的PHP后端API(使用Slim Framework)。
  5. 我无法让所有这三件事都奏效,虽然Nginx重写我可以实现#1和#2。

    为达到#1,我做了标准

    location / {
        root   html;
        index  index.html index.htm index.php;
    
        try_files $uri $uri/ /index.html;
    }
    

    重定向到index.html,记录良好。


    然而,这不适用于#2。如果我直接转到像www.example.com/store/item123/subitem345这样的嵌套网址,我会收到错误,无法加载我的require.js文件,这些文件正在www.example.com/store/item123/上查找。当然这不对。

    我可以使#2使用一些重写规则来删除URL中不需要的部分(/ store / item123部分)。它是否正确?如果是这样,是否有通用的重写来使这项工作?


    我永远无法让#3完全发挥作用。每当我进入嵌套路由(例如store / someitem123 / subitem345)时,Backbone会将URL的中间部分附加到后端API调用,这将自然地给出404。所以我会得到(store / someitem123 / php / api / args)而不是所需的(/ php / api / args /)。

    必须有一种方法可以覆盖Backbone的同步功能或使用Nginx重写来删除不需要的中间部分(在我的示例中为store / someitem123部分)。 作为参考,我必须在Nginx配置中使用此块以使后端调用完全起作用。但是目前它们只适用于没有深度嵌套URL的路径。

    location /php/ {
      try_files $uri $uri/ /php/chs_rest.php?$args;
    }
    

1 个答案:

答案 0 :(得分:0)

在我看来问题的关键是路由URL重写。根据nginx的Slim文档,您的conf文件不正确。请参阅此处的nginx部分:http://docs.slimframework.com/#Route-URL-Rewriting

编辑:已更新,以解决以下OP评论。

在您的具体情况下,我可以提出的最佳建议是将Backbone.js应用程序和Slim应用程序拆分为单独的应用程序。

流行的Backbone Wine Cellar教程sample application就是一个很好的例子。该应用程序的Slim部分已有几年历史,但它可以为构建当前应用程序提供极好的参考。

分割应用程序的好处很多,其中最大的可能是每个应用程序都更接近标准的Backbone和Slim应用程序。随着博客文章和文档以及SO问题将直接应用于您的应用程序,您可以随意学习和解决问题的资源将大大增加。未来的维护和持续的开发将变得更加容易。

我相信分割申请的努力会带来极高的投资回报。