URL кемпинга () не дает мне "корень сайта", как ожидалось?

Из-за обстоятельств, не зависящих от меня, мой производственный лагерь появляется на mysite.example.com/mysite, Я почти уверен, что это распространенная проблема конфигурации Apache / Passenger, и мне не интересно, как ее исправить прямо сейчас, потому что сервер находится вне моего контроля. Достаточно сказать, что контроллер для "/" точек там, и я не могу изменить это в ближайшее время.

В течение долгого времени это не было проблемой, потому что R(MyIndexController) указывает на правильное место. Тем не менее, я обслуживаю CSS моего сайта, используя Rack::Static вызов, чтобы сделать $SITE_ROOT/ общедоступным. Это означает, что таблица стилей находится на mysite.example.com/mysite/css/style.css, Вот в чем проблема: кемпинг URL() метод, когда вызывается в моем макете, дает http://mysite.example.comне http://mysite.example.com/mysite, Поэтому я не могу указать, чтобы он указывал на подкаталог /css, потому что в середине не хватает "прыжка". Когда я запускаю Rackup локально, все в порядке (потому что этот файл находится в localhost:8080/css/style.css), но на рабочем сервере я не знаю, как это исправить.

Мой вопрос: есть ли другой метод (может быть, прямо из Rack?), Который я должен вместо этого вызывать? Я действительно хочу избежать жесткого кодирования и / или иметь взлом, чтобы определить, работаю ли я локально (для отладки) или в производстве, для каждого рендеринга макета.

ЭТА: ОК, это становится незнакомым. Очевидно, что я абстрагировался от некоторых фактических деталей выше, часть которых, я думаю, я "перебрал". URL верхнего уровня на самом деле больше похож на /mysite/rest (HTML-презентация нашего интерфейса RESTful для разработчиков), в отличие от /mysite/management (счета) или /mysite/ui (JQuery'd / "хороший" интерфейс). Они установлены в нашем config.ru, через run Rack::URLMap.new(Hash['/rest' => RestModule, '/ui' => PrettyInterfaceModule, '/management' => UserManagerModule], так далее.

Таким образом, в ответ на комментарий ниже, R(Index) из представления в RestModule, фактически возвращает /mysite/rest/, В качестве примера у меня есть "домашняя" ссылка в макете, которая выглядит a :href=>R(Index)и генерирует код, который выглядит как <a href="/mysite/rest/">, Сервер настроен на обслуживание файлов из./public непосредственно в "корне сайта", поэтому ./public/css/style.css на самом деле появляется в http://mysite.example.com/mysite/css/style.css, как отмечалось ранее. Это та ссылка, которую у меня возникают проблемы при автоматическом создании, и из-за Rack::URLMap я подумал, что мне, возможно, придется полагаться на собственный метод Rack (а не абстракцию Camping), чтобы найти этот ресурс.

2 ответа

Решение

Так что в этом случае URL() на самом деле возвращается http://mysite.example.com/mysite/rest/? Как насчет этого?

URL().merge('../css/style.css')

Это старый вопрос, поэтому я предполагаю, что вы уже нашли обходной путь, но новый пассажир + apache (или ngnix) ведет себя правильно для кемпинга, насколько я мог повторить. Ваше приложение будет находиться в корневом каталоге документов, и все включения в папке /public, поэтому /public/css, должны корректно маршрутизироваться независимо от того, используете ли вы подпапку /mysite или нет, так как пассажир не имеет значения (опять же) в том, что касается как я могу повторить. Поэтому это должно быть легко решено с пассажиром 3 + Apache или ngnix.

Другие вопросы по тегам