告诉Apache不要因为404而惊慌失措,并允许Ember CLI路由器/适配器逻辑处理URL中的slug

告诉Apache不要因为404而惊慌失措,并允许Ember CLI路由器/适配器逻辑处理URL中的slug,apache,ember.js,ember-cli,Apache,Ember.js,Ember Cli,我的新Ember CLI应用程序使用URL中的用户门户slug向用户显示正确的信息。例如,假URL: 我使用路由器和适配器逻辑的组合从url slug中获取用户门户名称,然后显示与之相关的数据。它可能需要更多的工作,但到目前为止,我有以下几点: 路由器代码提取: Router.map(function () { this.route('portal', {path: '/:portal_slug'}, function () { this.resource('account', {p

我的新Ember CLI应用程序使用URL中的用户门户slug向用户显示正确的信息。例如,假URL:

我使用路由器和适配器逻辑的组合从url slug中获取用户门户名称,然后显示与之相关的数据。它可能需要更多的工作,但到目前为止,我有以下几点:

路由器代码提取:

Router.map(function () {
  this.route('portal', {path: '/:portal_slug'}, function () {
    this.resource('account', {path: '/'});
  });
});
基于门户找到正确API端点的适配器代码提取:

namespace: function () {
  var portal = window.location.pathname.match(/^\/([^\/]*).*$/)[0];
  return 'abc' + portal + '/api/v1';
}.property().volatile(),
我可以在本地点击应用程序,例如:没有问题。它使用Ember CLI的内置web服务器运行

但是,当我将应用程序移动到运行Apache的服务器上,并尝试点击它时,例如:,我得到:

我想这是有道理的,因为实际上没有一个与slug命名相同的目录。然而,我认为,必须有一种方法,让Apache忽略它认为存在的问题,并允许应用程序路由器来处理它。本地web服务器正在以某种方式执行此操作

理想情况下,解决方案将保持URL显示不变。此外,重新写入指向以下内容的请求会导致在错误路径中查找Ember CLI资产,因此无法动态设置baseUrl

如果您能提供有关如何在Apache中设置应用程序以实现此目的的任何反馈,我将不胜感激。

解决方案:

假设当前子域是my.portal.com。创建另一个指向服务器上相同目录的子域。将其命名为my2.portal.com

对于第一个子域,添加一个mod rewrite规则,该规则重写如下内容

http://my.portal.com/joe_blow
作为

这允许您在不使用404的情况下点击url

将生成的index.html中的资产路径设置为指向第二个子域。例如:

http://my2.portal.com/assets/app_name.js
这允许应用程序在url中查找资产,而不存在与重写或slug相关的问题

当然,您也可以将资产放在其他任何地方,包括S3存储桶。但在我的例子中,出于安全原因,我不得不将它们存储在同一服务器/网络上。按照我的方式,您可以将所有文件部署到同一位置

就这样!工作起来很有魅力


我唯一不喜欢的是,在索引文件生成后必须对其进行编辑。我将尝试在某个时候将其自动化。

我看到您正在本地计算机上的端口4200上加载应用程序,除非您手动更改,否则该端口肯定不是Apache端口。当您加载它时,它正在DocRoot中查找文件夹robertplant,它显然不在那里,并使用404命中。若您希望Apache从另一个端口上运行的应用程序获取页面,那个么我想最好使用代理传递。我想您还需要修改.htaccess文件。
http://my.portal.com?portal_slug=joe_blow
http://my2.portal.com/assets/app_name.js