告诉 Apache 不要对 404 感到恐惧,并允许 Ember-CLI router/adapter 逻辑处理 slug in URL

Tell Apache not to freak out over 404, and allow Ember-CLI router/adapter logic handle slug in URL

我的新 Ember-CLI 应用程序在 URL 中使用用户门户 slug 向用户显示正确的信息。例如(假URL):http://my.server.portals.com/robertplant

我正在使用路由器和适配器逻辑的组合从 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(),

我可以在本地点击应用程序(例如:http://localhost:4200/robertplant/),没有任何问题。它使用 Ember-CLI 的内置 Web 服务器运行。

但是,当我将应用程序移动到运行 Apache 的服务器并尝试访问它时(例如:http://my.server.portals.com/robertplant),我得到:

Not Found
The requested URL /robertplant was not found on this server.

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

理想情况下,解决方案会使 URL 显示相同。此外,重写请求以指向 http://my.server.portals.com?slug=robertplant 之类的内容会导致在错误的路径中查找 Ember-CLI 资产(无法动态设置 baseUrl)。

对于如何在 Apache 中设置应用程序以实现此目的的任何反馈,我将不胜感激。

解决方案:

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

  2. 对于第一个子域,添加一个 mod 重写规则,重写类似

    http://my.portal.com/joe_blow
    

    作为

    http://my.portal.com?portal_slug=joe_blow
    

    这允许您在没有 404 的情况下点击 url。

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

    http://my2.portal.com/assets/app_name.js
    

    这允许应用找到资产,而不会出现与重写相关的问题或 url 中的 slug。

    当然,您也可以将资产放在其他任何地方,包括S3 存储桶。但就我而言,出于安全原因,我必须将它们存储在同一个 server/network 上。按照我的方式,您可以将所有文件部署到同一位置。

就是这样!奇迹般有效。

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