2010-07-09 76 views
2

我的設置: 在1234端口上薄運行在端口--prefix /foobar 運行Apache 80個 apache的反向代理/foobar薄端口1234上如何更改目錄公共資產是從軌道服務?

我想靜態資產不通過代理薄送達,但而是直接通過apache服務於/assets

我必須使用相對路徑,因爲在啓動之前我不知道rails應用程序的主機名/ ip(它是應該能夠移動的應用程序框)。

我發現config.action_controller.asset_hostproduction.rb,但我不能將它設置爲相對路徑。當我這樣做的時候會感到困惑並創建真正的虛假網址。

我該如何做這項工作?

回答

0

首先,我要感謝Geoff和darkliquid。我採取了darkliquid的鏈接,並努力使其適用於我的案件。最大的挑戰是我沒有在Web服務器的根目錄下提供Rails應用程序。

注:

  • thin--prefix '/railsapp'在端口9999
  • 這適用於Windows和Linux上運行。 W00T!
  • 我必須使用LA-U(預見)才能得到apache使用的最終文件名。
  • IS_SUBREQ檢查是爲了防止從前返回代理的前瞻(一個子請求)。
  • /railsapp/index.html重寫是必需的,否則我的apache conf中的另一個規則會將其重寫爲/index.html,這是默認的「這是這裏的內容」頁面;儘管如此,404也在其他地方供應。

這裏的Apache配置的相關部分:

# Only proxy the thin stuff. 
<Proxy /railsapp/*> 
    Order deny,allow 
    Allow from all 
</Proxy> 

## Add an alias for filename mapping. 
Alias /railsapp "/website/root/railsapp/public" 

## We need the Rewrite Engine for this. 
RewriteEngine on 
<IfDefine debug> 
    ## If debugging, turn on logging. 
    RewriteLogLevel 9 
    RewriteLog "/website/logs/http.rewrite.log" 
</IfDefine> 

## Check for a static root page. 
RewriteRule ^/railsapp/?$ /railsapp/index.html [QSA] 

## Check for Rails caching. 
RewriteRule ^(/railsapp/[^.]+)$ $1.html [QSA] 

## Redirect all non-static requests to Rails. 
# Don't proxy on sub-requests (needed to make the LA-U work). 
RewriteCond %{IS_SUBREQ} false 
# Use look-ahead to see if the filename exists after all the rewrites. 
RewriteCond %{LA-U:REQUEST_FILENAME} !-f 
# Proxy it to Rails. 
RewriteRule ^/railsapp(.*)$ http://127.0.0.1:9999%{REQUEST_URI} [P,QSA,L] 

## Make sure Rails requests are reversed correctly. 
ProxyPassReverse /railsapp http://127.0.0.1:9999/railsapp 

## Disable keepalive; railsappd doesn't support them. 
SetEnv proxy-nokeepalive 1 
1

您不需要通過環境中的配置塊調用它,您可以從應用程序控制器調用它,從而使您可以訪問請求對象。所以你可以這樣做:

class ApplicationController < ActionController::Base 
    before_filter :set_asset_url 

    def set_asset_url 
    ActionController::Base.asset_host = "http://#{request.host}" 
    end 
end 

這感覺有點駭人,但我知道沒有更好的辦法。

,如果你需要擔心SSL和不同的端口,你可以去瘋狂:

ActionController::Base.asset_host = "http#{request.ssl? ? 's' : ''}://#{request.host_with_port}" 
+0

感謝。這絕對是另一種方式。我希望Rails有辦法在本地執行此操作,但是apache解決方案也非常好。 – 2010-07-12 16:28:08

+0

我說它感覺很ha,,我想你是走對了路。 – 2010-07-12 16:38:25

相關問題