告诉 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 中设置应用程序以实现此目的的任何反馈,我将不胜感激。
解决方案:
假设当前子域是 my.portal.com。创建另一个指向服务器上同一目录的子域。将其命名为 my2.portal.com
对于第一个子域,添加一个 mod 重写规则,重写类似
http://my.portal.com/joe_blow
作为
http://my.portal.com?portal_slug=joe_blow
这允许您在没有 404 的情况下点击 url。
将资产路径(在生成的 index.html 中)设置为指向第二个子域。例如:
http://my2.portal.com/assets/app_name.js
这允许应用找到资产,而不会出现与重写相关的问题或 url 中的 slug。
当然,您也可以将资产放在其他任何地方,包括S3 存储桶。但就我而言,出于安全原因,我必须将它们存储在同一个 server/network 上。按照我的方式,您可以将所有文件部署到同一位置。
就是这样!奇迹般有效。
我唯一不喜欢的是在生成索引文件后必须对其进行编辑。我会在某个时候尝试自动化它。
我的新 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 中设置应用程序以实现此目的的任何反馈,我将不胜感激。
解决方案:
假设当前子域是 my.portal.com。创建另一个指向服务器上同一目录的子域。将其命名为 my2.portal.com
对于第一个子域,添加一个 mod 重写规则,重写类似
http://my.portal.com/joe_blow
作为
http://my.portal.com?portal_slug=joe_blow
这允许您在没有 404 的情况下点击 url。
将资产路径(在生成的 index.html 中)设置为指向第二个子域。例如:
http://my2.portal.com/assets/app_name.js
这允许应用找到资产,而不会出现与重写相关的问题或 url 中的 slug。
当然,您也可以将资产放在其他任何地方,包括S3 存储桶。但就我而言,出于安全原因,我必须将它们存储在同一个 server/network 上。按照我的方式,您可以将所有文件部署到同一位置。
就是这样!奇迹般有效。
我唯一不喜欢的是在生成索引文件后必须对其进行编辑。我会在某个时候尝试自动化它。