簡體   English   中英

更改Nginx反向代理后面的應用程序的Rails鏈接路徑

[英]Change Rails link paths for application behind Nginx reverse proxy

我有一個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規則來proxy_pass起作用[請參見下文]。 現在的問題是, http://example.com/posts : http://example.com/posts (例如frontend_client_media_path )上提供的相對的Rails鏈接幫助程序仍指向Rails中定義的路徑,例如http://example.com/clients/example.com/media

只要站點被自定義域訪問,是否有可能告訴Rails通過省略/clients/example.com部分來以不同的方式構建路徑?

附錄

Nginx-Rule(它的肉)

server {
  server_name _; # allow all domains

  location / {
    proxy_pass http://upstream/frontend/clients/$host$request_uri; # proxy to client-specific subfolder
  }
}

您可以在路由中使用條件來檢查主機,然后加載自定義路徑。

基於域/主機或復雜的解析/重定向的約束

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。

您還可以包括其他邏輯以對其進行微調:

您可以使用controller_name或controller_path:

<% if controller_name.match(/^posts/) %>
    # Routing
<% end %>

<% if controller_path.match(/^posts/i) %> 
    # Routing
<% end %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM