![](/img/trans.png)
[英]Hosting Rails app on Thins, Nginx on a sub uri, behind a reverse proxy
[英]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.