更改Nginx反向代理

时间:2015-08-09 12:54:49

标签: ruby-on-rails nginx

我有一个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
  }
}

1 个答案:

答案 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 %>