【问题标题】:Client-side Javascript app - url routing with no hash tag客户端 Javascript 应用程序 - 没有哈希标记的 url 路由
【发布时间】:2013-01-28 11:55:53
【问题描述】:

我正在使用最新版本的 Ember.js 开发一个新的仅限客户端的应用程序。有一个 PHP 页面可以构建脚本、css、模板文件等,并将其全部交付到 index.php 中。我正在使用 htaccess 指令,以便将所有请求都重写到 /index.php。就我而言,PHP 只是为了方便地打包 Javascript。

目前,浏览器中的路由看起来像这样并且工作正常。

/#/about 
/#/favorites
/#/etc
/#/posts/5/edit

但是,我希望它们看起来像这样 - 这不能正常工作。

/about
/favorites
/etc
/posts/5/edit

第二个选项仍然提供完全相同的客户端代码 - 但它总是命中索引路由处理程序。我以前见过客户端应用程序实现这一点 - 我错过了什么?我需要在 PHP 端有匹配的路由处理程序吗?

编辑:我正在寻找有关如何解决此问题的具体答案。网络上充斥着“哦——你就这么做”的信息,让其他人摸不着头脑。

【问题讨论】:

    标签: ember.js url-routing client-side javascript-framework


    【解决方案1】:

    在 Ember.js(版本 1.0.0rc3)中,这可以通过使用 Ember.js location API 来完成:

    App.Router.reopen({
      location: 'history'
    });
    

    然后设置 Web 服务器将流量重定向到 Ember 应用程序。

    这里举一个具体的例子,一个基本的 Apache .htaccess 文件将流量重定向到位于 index.html 中的 Ember 应用程序:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.html#$1 [L]
    

    正如Alex White 指出的那样,Apache 2.2.16 及更高版本支持将流量重定向到单个目标的更简单配置:

    FallbackResource /index.html
    

    FallbackResourcemod_dir 模块的一部分,需要设置AllowOverride Indexes

    确保彻底测试应用程序路由。一个常见错误是Uncaught SyntaxError: Unexpected token <,它是由使用 CSS 和 JS 文件的相对链接引起的。在它们前面加上 / 标记以使其绝对。

    这个功能是not supported in Internet Explorer <10

    【讨论】:

    • 有没有办法在 Rails 路由器中也能做到这一点?
    • 您好!所以我已经完成了这项工作,并为localhost 提供了错误,但刷新仍然无法正常工作。我必须添加一行以允许与我的 couchdb 实例进行通信:RewriteCond %{REQUEST_FILENAME} !^_couch(.*)$ 我正在使用 Chrome 进行测试,有什么想法吗?
    • location: 'auto' 可能是旧浏览器的解决方案...如果不支持历史记录,它将在 url 中使用哈希。
    • 知道如何保存查询字符串...例如:/about?test=123&hi=hello 出于某种原因,我无法从 url 获取查询字符串,我确定它与更改 htaccess 中的某些内容有关
    • 用查询字符串弄清楚:RewriteRule ^(.*)$ index.php [QSA,L]
    【解决方案2】:

    比 RewriteRule 更好,您可以将其用于 Apache 2.2.16+:

    FallbackResource /index.html
    

    在您的 Apache 配置中,这样 RewriteRule 就不需要为每个请求运行。这将确保您的 ember 应用程序中的每条路由都落在 index.html 文件中。

    【讨论】:

      【解决方案3】:

      @Pascal:他说的不是实际的页面刷新,而是使用 Ember 的 history (location: 'history')。

      要回答您的问题,您需要配置 .htaccess 以像往常一样向 JavaScript 提供内容。一旦你的 URL 被配置为加载你的应用程序,Ember 就会像往常一样从 URL 中为你处理一切。

      【讨论】:

      • 您能举个例子说明如何为此配置 .htaccess 吗?
      【解决方案4】:

      是的,您需要在服务器端有匹配的路由。不使用哈希标记也会强制重新加载页面,从而减慢速度,并可能导致更多的刷新。

      另外,您需要通过服务器传递状态,或者使用浏览器本地存储的一些变体。

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 1970-01-01
        • 2017-07-22
        • 2016-01-02
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        相关资源
        最近更新 更多