Мне кажется, что я, должно быть, слишком усложняю это и / или что-то упускаю, но эта проблема уже давно меня расстраивает, и вот мои заметки.
Резюме
Есть две отдельные проблемы с двумя точками, каждая для динамических и статических маршрутов:
- как получить маршрутизацию для правильного соответствия входящего URL-адреса
- для маршрутов
- для статическихфайлы
- как генерировать URL-адреса, включающие относительный_кат
- с помощью помощников по URL
- для статических ресурсов
Один способ решить все четыре точки:
- Сконфигурировать Nginx для удаления части
relative_root
- Это решает сопоставление маршрута;просто пишите маршруты, ожидающие URL-адреса на
/
, как в разработке - Также статические файлы обслуживаются как в разработке
- Установить
RAILS_RELATIVE_URL_ROOT
переменную среды - Thisрешает сгенерированные помощники статического ресурса
- Используйте промежуточное ПО
ScriptName
ниже (измените его, чтобы использовать значение из среды) - Это решает сгенерированные помощники URL, например
users_path
Упаковка приложения Rails в Rack :: URLMap на config.ru (ответ Кристофа) * 1054 * # config.ru
map '/relative_root' do
run Myapp::Application
end
требует, чтобы входящий URL содержалlative_url_root (Nginx может быть настроен на удаление или сохранение этого; см. ниже) Стойка добавляет относительный_url_root к стойке env SCRIPT_NAME
rack / urlmap.rb: 62 Rails добавляет текущий запрос SCRIPT_NAME
к параметрам url_for metal / url_for.rb: 41 url_for Rails добавляет имя сценария при генерации путей routing / url_for.rb:133 Так что охватывает URLгенерируется помощниками по URL, например, с учетом UserController
, users_path
будет префикс относительного корня URL. Установить SCRIPT_NAME в промежуточном программном обеспечении
# config.ru
class ScriptName
def initialize(app, name)
@app = app
@name = name
end
def call(env)
env['SCRIPT_NAME'] += @name
@app.call(env)
end
end
use ScriptName, '/relative_root'
run Rails.application
- Имеет тот же эффект, что ивыше, но
- Требуется, чтобы входящий URL НЕ содержал относительный_url_root
Установка RAILS_RELATIVE_URL_ROOT
Настройка config.action_controller.relative_url_root
- ??Может повлиять на компиляцию активов?
- Переопределяет RAILS_RELATIVE_URL_ROOT env var?
Явное определение всех маршрутов в /relative_root
(ответ Риззы)
# config/routes.rb
Myapp::Application.routes.draw do
scope '/relative_root' do
...
end
end
- Urlпомощники будут генерировать правильные URL-адреса
- Входящий URL-адрес должен содержать относительный корень URL-адреса (чувствителен к конфигурации Nginx, см. ниже), в противном случае исключения «без совпадения маршрута»
- URL-адреса, запрашивающие статические ресурсы, например
/relative_root/images/logo.png
приведет к исключениям «нет совпадений маршрутов».Это может не быть проблемой, если nginx все равно обслуживает статические ресурсы.
Конфигурация Nginx
Учитывая такую конфигурацию, как:
upstream myapp {
server localhost:3000;
}
server {
...
location /relative_root {
proxy_pass http://myapp/;
}
}
Nginx будет удален/relative_root
, и приложение Rails не увидит его.Если вам нужно приложение Rails, чтобы увидеть его, можно изменить строку proxy_pass
:
...
proxy_pass http://myapp/relative_root/;
...