URL кемпинга () не дает мне "корень сайта", как ожидалось? - PullRequest
2 голосов
/ 21 сентября 2010

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

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

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

ETA: ОК, это становится незнакомым. Очевидно, что я абстрагировал некоторые из фактических деталей выше, часть которых, я думаю, я «перебрал». URL верхнего уровня на самом деле больше похож на /mysite/rest (HTML-презентация нашего интерфейса RESTful для разработчиков), а не на /mysite/management (учетные записи) или /mysite/ui (пользовательский интерфейс JQuery'd / "nice") , Они настраиваются на нашем 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 ]

1 голос
/ 22 сентября 2010

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

URL().merge('../css/style.css')
0 голосов
/ 13 апреля 2012

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

...