【发布时间】:2018-10-07 22:31:05
【问题描述】:
现在我对 Sinatra/Ruby/Apache 还是很陌生,但我继承了一个 Sinatra 应用程序来部署。
当前 Apache 设置为从文档根目录 (httpdocs) 运行,我需要在文件夹子目录下运行 ruby 应用程序,例如:/httpdocs/webapp
我需要做什么才能在子目录下启动并运行它?
【问题讨论】:
现在我对 Sinatra/Ruby/Apache 还是很陌生,但我继承了一个 Sinatra 应用程序来部署。
当前 Apache 设置为从文档根目录 (httpdocs) 运行,我需要在文件夹子目录下运行 ruby 应用程序,例如:/httpdocs/webapp
我需要做什么才能在子目录下启动并运行它?
【问题讨论】:
此链接可能会有所帮助,它解释了如何使用 Passenger (mod_rack) 使用 Apache 部署 Sinatra 应用程序: Deploying a Sinatra App with Apache and Phusion Passenger
您特别感兴趣的部分是虚拟主机配置中的RackBaseURI 选项。官方文档可在此处获得:
Phusion Passenger users guide - Deploying Rack to Sub URI
【讨论】:
Directory 指令中指定了 Apache RackBaseURI 选项,而且使用文章 @brentvatne 链接中描述的符号链接方法似乎很重要。
我刚刚遇到了同样的问题。由于这里没有关于如何在没有Passenger 的情况下执行此操作的答案,我将记录Apache + CGI 或FastCGI 的解决方案。
诀窍是为 Rack 重写 PATH_INFO,一切都会到位:
设置.htaccess:
RewriteEngine On
RewriteRule ^(.*)$ sinatra_app.cgi [QSA,L,E=PATHINFO:/$1]
在您的 Sinatra 代码中,在其他任何内容之前:
ENV['PATH_INFO'] = ENV['REDIRECT_PATHINFO']
现在所有像 /subfolder/resource/123 这样的 URL 都会在 Sinatra 应用程序中找到正确的路径。
在上述情况下,get '/resource/:id' 将正常工作,假设 Sinatra 应用程序已放入 /subfolder。
【讨论】: