Как изменить каталог публичных ресурсов, обслуживаемых в рельсах? - PullRequest
2 голосов
/ 10 июля 2010

Моя настройка: работает на порту 1234 с --prefix /foobar Apache работает на порту 80 обратные прокси-серверы Apache /foobar на порт 1234

Я бы хотел, чтобы статические ресурсы не обслуживались через прокси-сервер для уменьшения, а вместо этого передавались в /assets напрямую через apache.

Мне нужно использовать относительный путь, потому что я не знаю имя хоста / ip приложения rails перед запуском (это app-in-a-box, которое можно перемещать).

Я нашел config.action_controller.asset_host в production.rb, но не могу установить для него относительный путь. Когда я делаю это, он запутывается и создает действительно поддельные URL.

Как я могу сделать эту работу?

Ответы [ 3 ]

1 голос
/ 10 июля 2010

Это в некоторой степени зависит от вашей серверной среды, но в основном вы хотите что-то в соответствии с тем, что описано здесь: http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/

1 голос
/ 10 июля 2010

Вам не нужно вызывать его через блок конфигурации в среде, вы можете вызвать его из контроллера приложения, который дает вам доступ к объекту запроса. Так что вы могли бы сделать:

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 голосов
/ 12 июля 2010

Во-первых, я хочу поблагодарить Джеффа и darkliquid.Я взял то, что было в ссылке darkliquid и работал над этим, чтобы это работало для моего случая.Большая проблема заключалась в том, что я не обслуживал приложение rails из корня веб-сервера.

Примечания:

  • thin запускается с --prefix '/railsapp' на порту 9999.
  • Это работает для Windows и Linux.W00T!
  • Мне нужно использовать LA-U (упреждающий просмотр), чтобы получить окончательное имя файла, которое будет использовать apache.
  • Проверка IS_SUBREQ предназначена для предотвращения упреждающего просмотра (asub request) от когда-либо возвращающего прокси.
  • Требуется перезапись /railsapp/index.html, потому что в противном случае другое правило в моем apache conf переписало бы его на /index.html, который является страницей по умолчанию «вот что здесь»;404 s обслуживаются в других местах.

Вот соответствующая часть конфигурации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...