【问题标题】:Backbone pushState and error 404主干 pushState 和错误 404
【发布时间】:2013-02-27 06:46:53
【问题描述】:

我正在尝试实现{ pushState : true },但它仅适用于基本路由,不适用于继续给我错误 404 的其他路由。

在 Chrome 中,如果我访问:

http://example.app/ - OK,显示控制台消息

http://example.app/show - 返回错误 404

我的路线是

    var AppRouter = Backbone.Router.extend({

    routes: {
        '': 'index',
            'show': 'show'
        },

        index: function() {
            console.log('This is the index page');
        },
        show: function() {
            console.log('This is the show page');
        }

    });

    new AppRouter;
    Backbone.history.start({pushState: true});

我的 .htaccess

<ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !index
   RewriteRule (.*) index.html [L]
</ifModule>

我错过了什么或我做错了什么?

【问题讨论】:

    标签: backbone.js backbone-routing


    【解决方案1】:

    请记住,Backbone 是一个客户端框架——如果您使用基于路径的 URL 进行路由(推送状态),您仍然需要确保服务器为这些 URL 返回正确的标记。这在Backbone docs 中总结如下:

    请注意,使用真实 URL 需要您的 Web 服务器能够正确呈现这些页面,因此还需要进行后端更改。例如,如果您有 /documents/100 的路由,如果浏览器直接访问该 URL,则您的 Web 服务器必须能够提供该页面。对于完整的搜索引擎可抓取性,最好让服务器为页面生成完整的 HTML ......但如果它是一个 Web 应用程序,只需呈现与根 URL 相同的内容,然后用 Backbone 填充其余内容视图和 JavaScript 工作正常。

    换句话说,如果您的服务器不理解example.app/show,Backbone 将无法帮助您——您必须使用 URL 重写和/或您选择的服务器端语言来修复服务器。

    【讨论】:

    • 是的,叹息。希望我的后端自己写
    【解决方案2】:

    您需要为这种情况创建一个初始化函数。

    我在样板路由器上连接了一些东西,只需在脚本末尾初始化路由器之前包含它。

    var initialize = function() {
    
        var app_router = new AppRouter;
    
        Backbone.history.start({ pushState: false });
    
        $(document).on('click', 'a:not([data-bypass])', function(e){
    
            var href = $(this).prop('href');
            var root = location.protocol + '//' + location.host + '/';
    
            if (root === href.slice(0, root.length)){
                e.preventDefault();
                Backbone.history.navigate(href.slice(root.length), true);
            }
        });
    
    };
    

    【讨论】:

      【解决方案3】:

      我认为您可能只是缺少网址中的“#”。 我现在正在关注一些教程,我刚刚意识到他们如何阻止请求进入服务器。

      所以不是
      http://example.app/show

      http://example.app/#/show

      骨干应该能够抓住它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 2012-10-15
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多