【问题标题】:Setting up Sinatra to run in a subdirectory设置 Sinatra 在子目录中运行
【发布时间】:2018-10-07 22:31:05
【问题描述】:

现在我对 Sinatra/Ruby/Apache 还是很陌生,但我继承了一个 Sinatra 应用程序来部署。

当前 Apache 设置为从文档根目录 (httpdocs) 运行,我需要在文件夹子目录下运行 ruby​​ 应用程序,例如:/httpdocs/webapp

我需要做什么才能在子目录下启动并运行它?

【问题讨论】:

    标签: ruby apache sinatra


    【解决方案1】:

    此链接可能会有所帮助,它解释了如何使用 Passenger (mod_rack) 使用 Apache 部署 Sinatra 应用程序: Deploying a Sinatra App with Apache and Phusion Passenger

    您特别感兴趣的部分是虚拟主机配置中的RackBaseURI 选项。官方文档可在此处获得: Phusion Passenger users guide - Deploying Rack to Sub URI

    【讨论】:

    • 感谢布伦特,这正是我所需要的!
    • 知道了。但是子目录中的应用程序将“/”指向父应用程序。如何将其指向每个应用程序的根目录?
    • goo:如果我正确理解您的问题,sinatra 应用程序在子目录中生成的任何 url 引用都没有考虑包含子目录名称的基本 url。如果这是问题所在,您可以查看类似以下的 gem:sinatra-url-for 或按照此讨论中的建议创建帮助器 get absolute base url in sinatra
    • goo:正如@brentvatne 所说,您应该始终使用 URL 助手 - 因为 Sinatra 1.2.0 有一个 helper included。此外,我得到了奇怪的结果,因为我在 Apache 配置中的 Directory 指令中指定了 Apache RackBaseURI 选项,而且使用文章 @brentvatne 链接中描述的符号链接方法似乎很重要。
    【解决方案2】:

    我刚刚遇到了同样的问题。由于这里没有关于如何在没有Passenger 的情况下执行此操作的答案,我将记录Apache + CGI 或FastCGI 的解决方案。

    诀窍是为 Rack 重写 PATH_INFO,一切都会到位:

    1. 设置.htaccess:

       RewriteEngine On
       RewriteRule ^(.*)$ sinatra_app.cgi [QSA,L,E=PATHINFO:/$1]
      
    2. 在您的 Sinatra 代码中,在其他任何内容之前:

       ENV['PATH_INFO'] = ENV['REDIRECT_PATHINFO']
      

    现在所有像 /subfolder/resource/123 这样的 URL 都会在 Sinatra 应用程序中找到正确的路径。
    在上述情况下,get '/resource/:id' 将正常工作,假设 Sinatra 应用程序已放入 /subfolder。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2011-01-08
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2015-06-13
      相关资源
      最近更新 更多