【问题标题】:Camping's URL() doesn't give me "site root" as expected?Camping 的 URL() 没有像预期的那样给我“站点根目录”?
【发布时间】:2010-09-20 22:08:57
【问题描述】:

由于我无法控制的情况,我的生产露营网站出现在mysite.example.com/mysite。我很确定这是一个常见的 Apache/Passenger 配置问题,我现在对如何修复它不感兴趣,因为服务器超出了我的控制范围。可以说,“/”的控制器指向那里,我不能很快改变它。

现在,很长一段时间以来,这都不是问题,因为R(MyIndexController) 指向了正确的位置。但是,我使用 Rack::Static 调用为我的站点的 CSS 提供服务,以使 $SITE_ROOT/public 可访问。这意味着样式表位于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(我们的 RESTful 界面的以开发人员为中心的 HTML 表示),而不是 /mysite/management(帐户)或 /mysite/ui(JQuery'd / “nice” UI) .这些是通过run Rack::URLMap.new(Hash['/rest' => RestModule, '/ui' => PrettyInterfaceModule, '/management' => UserManagerModule] 等在我们的config.ru 中设置的。

因此,对于下面的评论,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 抽象)来定位它资源。

【问题讨论】:

  • R(MyController) 返回什么? /mysite/?

标签: ruby rack stylesheet camping


【解决方案1】:

所以在这种情况下,URL() 实际上返回了http://mysite.example.com/mysite/rest/? 像这样的东西呢?

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

【讨论】:

  • 我有点转过身——URL() 只返回 URL 的基本部分,正如我在上面http://mysite.example.com 所说的那样。但是,R(Index) 返回http://mysite.example.com/mysite/rest/。所以我可以试试R(Index).merge('../css/style.css'),但这感觉有点老套。
  • 哎呀,R(Index) 实际上返回的是相对路径,所以它是/mysite/rest。这意味着我需要使用URL(Index).merge('../css/style.css'),但这个想法成立
【解决方案2】:

这是一个老问题,所以我假设您确实已经找到了解决方法,但新乘客 + apache(或 ngnix)在我可以复制的情况下正确地进行露营。您的应用程序将位于 Documents 根目录中,并且所有包含在 /public 文件夹中,因此无论您是否使用子文件夹 /mysite 都应该正确路由 /public/css ,因为乘客不会(再次)产生影响我可以复制。因此,这应该可以通过乘客 3 + Apache 或 ngnix 轻松解决。

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2013-04-11
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多