etspring
@etspring
Начитанное быдло

Как решить проблему с роутингом в рельсах при проксировании nginx?

Дано:
HOST1 адрес: free.magazine.ru/1c/ , который проксируется через nginx ( конфиг ниже ) в HOST2
1c.partner.ru, на котором развернуто Rails-приложение ( ruby 2.1.0, rails 4.1.4, unicorn + nginx ).

HOST1 NGINX CONF
location ^~ /1c {
		proxy_pass http://1c.partner.ru;
		include includes/upstream_proxyhost.conf;
		proxy_redirect http://1c.partner.ru/ /;
}


HOST2 NGINX CONF
upstream 1c-new {
  server unix:/tmp/unicorn.1c-new.sock fail_timeout=0;
}

server {
  listen 80;
  server_name 1c.partner.ru;

  root /home/deployer/1c/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @1c-new;

  location @1c-new {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://1c-new;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}


При обращении по адресу free.magazine.ru/1c открывается root приложения без assets.
Все линки на страницах не содержат в себе /1c/ и поэтому являются нерабочими. Т.е. вместо нормального адреса free.magazine.ru/1c/products/707/online ссылка ведет на free.magazine.ru/products/707/online
Перестает работать session.

Хотя приложение без проксирования ( по адресу 1c.patner.ru ) работает отлично.

ROUTES.RB
1c::Application.routes.draw do
  
  #scope "/1c/" do  
    resource :session  

    resources :users

    resources :oauth
    
    resources :categories do
      member do
        get :online, :home
      end
    end

    resources :products do
      member do
        get :online, :home, :go
      end
    end

    match 'logout', to: 'sessions#destroy', via: :get

    match 'search', to: 'welcome#search', via: :get
    match 'regulation', to: 'welcome#regulation', via: :get
    match 'online', to: 'welcome#online', via: :get   
    match 'home', to: 'welcome#home', via: :get
    
  #
    root to: 'welcome#online'
  #end
end
#1c::Application.routes.default_url_options[:host] = 'free.magazine.ru'


Пробовал использовать scope "/1c/" и default_url_options ( см. routes.rb ) вместе с config.assets.prefix - результат такой же, как и описан выше.
Каким образом можно заставить приложение работать нормально при таком проксировании?

Заранее спасибо за ответ.

UPD1:
Добавление config.relative_url_root = "/1c" в production.rb решило проблему assets, но линки по прежнему генерятся без префика 1с.

UPD2 РЕШЕНО:

NGINX HOST1
server {
  listen 80;
  server_name free.magazine.ru;

  location ^~ /1c {
    proxy_pass http://1c.partner.ru;
  }
}


NGINX HOST2
server {
  listen 80;
  server_name 1c.roscontent.ru;

  root /home/deployer/1c/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @h5c-new;

  location @1c-new {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://1c-new;
  }

}


Магия рельс
routes.rb

1c::Application.routes.draw do
 
  scope "/1c/" do  
    resource :session  

    resources :users

    resources :oauth
    
    resources :categories do
      member do
        get :online, :home
      end
    end

    resources :products do
      member do
        get :online, :home, :go
      end
    end

    match 'logout', to: 'sessions#destroy', via: :get

    match 'search', to: 'welcome#search', via: :get
    match 'regulation', to: 'welcome#regulation', via: :get
    match 'online', to: 'welcome#online', via: :get   
    match 'home', to: 'welcome#home', via: :get
    
  #
    root to: 'welcome#online'
  end
end


application.rb
module 1c
  class Application < Rails::Application
   config.relative_url_root = '/1c'
   end
end


production.rb
config.assets.prefix = File.join((config.relative_url_root || '/'), 'assets')
  • Вопрос задан
  • 2351 просмотр
Пригласить эксперта
Ответы на вопрос 2
anyd3v
@anyd3v
Вы об этом?
The default location for the manifest is the root of the location specified in config.assets.prefix ('/assets' by default).

(это касаемо assets)

UPD по поводу ссылок нашел такое решение
https://community.webfaction.com/questions/9563/wr...

UPD2 и такое
ENV["RAILS_RELATIVE_URL_ROOT"] is used by the routing code to recognize URLs when you deploy your application to a subdirectory.

guides.rubyonrails.org/configuring.html#deploy-to-...
Ответ написан
AMar4enko
@AMar4enko
location / {
    location /assets {
       gzip_static on;
       expires max;
       add_header Cache-Control public;
    }
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://1c-new; 
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы