Apache2 上的 Sinatra 应用程序中的智能生根

发布于 2024-12-12 14:51:15 字数 1737 浏览 0 评论 0原文

在我的本地 Apache2 上,我有多个应用程序。我的 httpd.conf 看起来像这样:

<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /var/www/

  RackBaseURI /app1
  RackBaseURI /app2
  RackBaseURI /app3
</VirtualHost>

每个应用程序的 config.ru 看起来都一样:

require './app'
root_dir = File.dirname(__FILE__)
set :environment, ENV['RACK_ENV'].to_sym
set :root, root_dir
set :app_file, File.join(root_dir, 'app.rb')
disable :run
run Sinatra::Application

在 /var/www/ 目录中,我有指向每个应用程序的公共文件夹的符号链接。 (app1/public --> 名为 app1 的链接,app2/public --> 名为 app2 的链接,等等)

如果我打开 localhost/app1 则启动操作 (获取 app1 的 '/')

get '/' do
  erb :main
end

到目前为止一切都很好作品。在视图 main.erb (在 get '/' aciton 中加载)中,我从 public/js 目录加载一些 javascript。

这就是我的问题。我必须像这样加载它们(关注 src="/app1/....."):

<script type="text/JavaScript" src="/app1/js/jquery.js"></script>

虽然我想像那样加载它们:

<script type="text/JavaScript" src="/js/jquery.js"></script>

原因是当我在 eq Heorku 上上传我的应用程序时它不会在我从代码中删除每个“/app1”之前,它不再起作用。

总而言之,在 localhost 上,我的 Sinatra app1 将 localhost/ 作为 root,尽管真正的 root 应该是 localhost/app1/。另一方面,在 Heroku 上,它以 app1.heroku.com/ 作为 root,这是可以的。

所以问题是我该怎么做才能使我的每个应用程序都以 localhost/appX/ 作为根?

编辑:

这个问题还涉及javascript:(/app1/some_action) 在本地主机上它必须是这样的:

$(document).ready(function(){
  $("#a_button").click(function(){
    $("#some_div").load("/app1/some_action");
  });
});

而在服务器上它必须是这样的:

$(document).ready(function(){
  $("#a_button").click(function(){
    $("#some_div").load("/some_action");
  });
});

On my local Apache2 I have multiple applications. My httpd.conf looks like this:

<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /var/www/

  RackBaseURI /app1
  RackBaseURI /app2
  RackBaseURI /app3
</VirtualHost>

config.ru of every application looks the same:

require './app'
root_dir = File.dirname(__FILE__)
set :environment, ENV['RACK_ENV'].to_sym
set :root, root_dir
set :app_file, File.join(root_dir, 'app.rb')
disable :run
run Sinatra::Application

In /var/www/ directory I have symbolic links to public folder of each of my applications. (app1/public --> the link called app1, app2/public --> the link called app2, etc)

If I open localhost/app1 is starts action (get '/' of app1)

get '/' do
  erb :main
end

So far so good, everything works. In the view main.erb ( loaded in get '/' aciton) I'm loading some javascripts from public/js directory.

And here appears my problem. I have to load them like that (focus on src="/app1/....."):

<script type="text/JavaScript" src="/app1/js/jquery.js"></script>

While I'd like to load them like that:

<script type="text/JavaScript" src="/js/jquery.js"></script>

The reason is that when I upload my application on e.q. Heorku it doesn't work anymore until I remove every "/app1" from my code.

To sum up, on localhost my Sinatra app1 takes localhost/ as root though the real root should be localhost/app1/. On the other hand on heroku it takes app1.heroku.com/ as root which is ok.

So the question is what can I do to make each of my applications take localhost/appX/ as a root?

Edit:

This problem also involves javascripts: (/app1/some_action)
On localhost it has to be like this:

$(document).ready(function(){
  $("#a_button").click(function(){
    $("#some_div").load("/app1/some_action");
  });
});

While on a server it has to be be like that:

$(document).ready(function(){
  $("#a_button").click(function(){
    $("#some_div").load("/some_action");
  });
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空名 2024-12-19 14:51:15

您可以创建帮助程序方法,根据环境在 URL 前面添加适当的前缀,或使用 静态资源 sinatra 助手。

You can create helper method that will prepend appropriate prefix to your URLs depending on the environment, or use static assets sinatra helper.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文