我有一个Rails应用程序(http://example.org),其中多个租户可以拥有一个简单的CMS。他们获得了一个前端位于http://example.org/frontend/clients/:client_name
的相对子路径,例如/posts
和/media
。
现在我想允许租户使用自定义域名,因此应用程序将例如使用http://example.com/posts
的内容回复http://example.org/clients/example.com/posts
的请求。
我设法编写了一个Nginx proxy_pass
规则来实现这一点[见下文]。问题是,http://example.com/posts
(例如frontend_client_media_path
)上提供的相对Rails链接助手仍然指向Rails中定义的路径,例如: http://example.com/clients/example.com/media
。
只要该网站被自定义域访问,是否有可能通过省略/clients/example.com
部分来告诉Rails以不同方式构建路径?
附录
Nginx-Rule(它的内容)
server {
server_name _; # allow all domains
location / {
proxy_pass http://upstream/frontend/clients/$host$request_uri; # proxy to client-specific subfolder
}
}
答案 0 :(得分:1)
您可以在检查主机的路由中使用条件,然后加载自定义路径。
Constraints based on domain/host Or Complex Parsing/Redirecting
constraints(host: /^(?!.*example.org)/) do
# Routing
end
# http://foo.tld?x=y redirects to http://bar.tld?x=y
constraints(:host => /foo.tld/) do
match '/(*path)' => redirect { |params, req|
query_params = req.params.except(:path)
"http://bar.tld/#{params[:path]}#{query_params.keys.any? ? "?" + query_params.to_query : ""}"
}, via: [:get, :post]
end
注意:如果您要处理的是完整域而不仅仅是子域,请使用:domain而不是:host。
You can also include other logic to fine tune it for ex:
您可以使用controller_name或controller_path:
<% if controller_name.match(/^posts/) %>
# Routing
<% end %>
<% if controller_path.match(/^posts/i) %>
# Routing
<% end %>