Apache2 上的 Sinatra 应用程序中的智能生根
在我的本地 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以创建帮助程序方法,根据环境在 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.