【发布时间】:2017-06-09 01:47:16
【问题描述】:
我们的 Rails 4 应用程序需要可通过古老的门户访问。该门户通过为每个 URL 添加(从浏览器的角度)前缀来工作;在将请求转发到我的应用程序之前,门户会删除此前缀。
所以浏览器调用https://portal.company.com/portal/prefix/xyzzy/myapp/mymodel/new;门户做它的事情并请求https://myserver.company.com/myapp/mymodel/new(以某种不相关的方式传递剥离的前缀)。前缀是动态的,可以在请求之间更改。
问题是门户无法重写我的应用程序提供的 HTML 页面。也就是说,它没有放在前缀中。它期望应用程序要么只发出相对 URL,要么自己添加门户前缀。
所以:
- 例如,常规 URL
/myapp/mymodel/new在直接访问应用程序时必须保持原样(对于某些不使用门户的用户)。 - 当通过门户访问时,我们的应用程序仍然必须像往常一样理解
/myapp/mymodel/new,但是当使用mymodel_new_path或link_to @mymodel或form_for @my_model或任何其他神奇的URL 生成器时,它必须添加门户前缀.因此,应用程序发出的任何 URL 都必须类似于/portal/prefix/xyzzy/myapp/mymodel/new,其中每个请求的字符串/portal/prefix/xyzzy由我们定义的某种方法给出(xyzzy部分可以在请求之间更改)。
我怎样才能做到这一点?我的routes.rb 今天看起来像这样:
MyApp::application.routes.draw do
scope ' /myapp' do
get ...
这可能必须保持原样,因为传入请求中的 URL 在来自门户时不会更改。但是如何影响传出 URL?
【问题讨论】:
-
如果请求来自门户,您可以编写简单的中间件将前缀附加到所有相对路径
-
@ArkadiuszOleksy,你的意思是它会像
html.gsub!(/myurlroot/, "portalprefix/myurlroot那样做一些事情?是的,我有这个想法,它应该足够简单,但有点希望在不重写的情况下从根本上解决问题。如果没有其他问题,我会记住的。