23

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

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

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

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

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

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

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

4

4 回答 4

48

在 Ember.js(版本 1.0.0rc3)中,这可以通过使用Ember.js 位置 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 文件的相对链接引起的。在它们前面加上一个/标记,使它们成为绝对的。

Internet Explorer <10 不支持此功能。

于 2013-05-14T23:07:22.633 回答
8

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

FallbackResource /index.html

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

于 2014-02-11T14:41:49.087 回答
1

@Pascal:他不是在谈论实际的页面刷新,而是使用 Ember 的historylocation: 'history')。

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

于 2013-02-13T01:48:25.903 回答
0

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

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

于 2013-02-13T01:38:02.517 回答