我知道这是一个奇怪的事。我正在尝试将两个Rails应用程序,一个v3和一个v2.3.5
联系在一起我希望他们共享同一个域,为了在不更改旧应用程序中的URL的情况下这样做,我正试图找到一种方法来覆盖Rails路由器。
我希望较新的应用程序位于域的根目录,而较旧的应用程序位于多个目录下。例如:
/ => app1 # v3
/users => app1
/employees => app2 # v2.3.5
/payrolls => app2
所以,既然app1生活在root用户并且我正在使用Passenger,我只需要在app1的public
文件夹中创建符号链接到app2的公共文件夹,如下所示:
app1/public/employees => app2/public
app1/public/payrolls => app2/public
然后我将RailsBaseURI /employees
和RailsBaseURI /payrolls
添加到Apache的配置中。
有了这个,我可以使app2的旧URL工作,但在应用程序内,链接指向前缀。例如,/employees/1
,/employees/employees/1
,/payrolls/employees/1
都有效,但应用中的链接指向/employees/employees/1
和/payrolls/employees/1
,具体取决于我当前使用的前缀
因此,我需要从链接中删除该前缀,以便只使用旧URL。
我需要这样做才能发布更新的应用。我及时将旧版本升级到v3并直接解决此问题,但现在任何黑客攻击都可以使其正常工作。
我不指望一个解决方案,但是如果你能指出我在Rails源代码的正确方向,或者我可能没有看到更简单的方法,我将非常感激。
答案 0 :(得分:1)
通过覆盖url_for
中的ApplicationHelper
就可以了,这很简单:
def url_for(options = {})
original = super(options)
# I tried this in order to improve performance:
return original unless original.starts_with?('/employees/employees')
original.gsub('/employees/employees', '/employees')
end
然而,这导致应用程序中的间歇性错误,我无法确定。我想这是因为性能受到了影响。
所以最后我不得不为不同的应用程序使用不同的域名。
答案 1 :(得分:0)
我不确定你的路线上是否可以使用2个不同版本的rails,但另一种方法是使用haproxy和2个不同的服务器。
# In haproxy.conf:
frontend rails
bind *:80
acl rails2 hdr_host(end) -i employees.mydomain.com
acl rails3 hdr_host(end) -i mydomain.com
use_backend rails2_server if rails2
use_backend rails3_server if rails3
default_backend rails3_server
backend rails2_server
server myrails2_server 192.168.1.1:3000 check
backend rails3_server
server myrails3_server 192.168.1.1:3001 check
然后将您的DNS A记录mydomain.com指向您的haproxy IP并将employees.mydomain.com指向mydomain.com/employees。
要测试它,您可以将haproxy服务器和mydomain.com的IP地址添加到/ etc / hosts文件