Дано:
HOST1 адрес: free.magazine.ru/1c/ , который проксируется через nginx ( конфиг ниже ) в HOST2
1c.partner.ru, на котором развернуто Rails-приложение ( ruby 2.1.0, rails 4.1.4, unicorn + nginx ).
HOST1 NGINX CONFlocation ^~ /1c {
proxy_pass http://1c.partner.ru;
include includes/upstream_proxyhost.conf;
proxy_redirect http://1c.partner.ru/ /;
}
HOST2 NGINX CONFupstream 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.RB1c::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 HOST1server {
listen 80;
server_name free.magazine.ru;
location ^~ /1c {
proxy_pass http://1c.partner.ru;
}
}
NGINX HOST2server {
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.rb1c::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.rbmodule 1c
class Application < Rails::Application
config.relative_url_root = '/1c'
end
end
production.rbconfig.assets.prefix = File.join((config.relative_url_root || '/'), 'assets')