如何更改目录公共资产是从rails中提供的?

时间:2010-07-09 21:34:25

标签: ruby-on-rails ruby apache

我的设置:  使用--prefix /foobar在端口1234上运行瘦身  apache在端口80上运行  apache反向代理/foobar在端口1234上精简

我希望静态资产不会通过代理提供给瘦身,而是通过apache直接在/assets提供服务。

我必须使用相对路径,因为我在启动之前不知道rails应用程序的主机名/ ip(它是应该能够移动的app-in-a-box)。

我在config.action_controller.asset_host中找到production.rb,但我无法将其设置为相对路径。当我这样做时会感到困惑并创建真正虚假的URL。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您无需通过环境中的配置块调用它,您可以从应用程序控制器调用它,这样您就可以访问请求对象。所以你可以这样做:

class ApplicationController < ActionController::Base
  before_filter :set_asset_url

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

感觉有点hackish,但我知道没有更好的方法。

如果你需要担心ssl和不同的端口,你可能会发疯:

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

答案 1 :(得分:1)

这在某种程度上取决于您的服务器环境,但基本上您需要的内容与此处描述的内容类似:http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/

答案 2 :(得分:0)

首先,我要感谢Geoff和darkliquid。我采用了darkliquid的链接并对其进行了处理以使其适用于我的情况。最大的挑战是我没有从网络服务器的根目录提供rails应用程序。

注意:

  • thin在端口9999上使用--prefix '/railsapp'运行。
  • 这适用于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