2

所以我有两个要在服务器上运行的应用程序。一个应用程序我想成为“默认”应用程序 - 也就是说,默认情况下,所有 URL 都应该发送给这个应用程序,除了某个路径,让我们称之为/foo

http://mydomain.com/        -> app1
http://mydomain.com/apples  -> app1
http://mydomain.com/foo     -> app2

我的两个机架应用程序是这样安装的:

/var
  /www
    /apps
      /app1
        app.rb
        config.ru
        /public
      /app2
        app.rb
        config.ru
        /public
    app1 -> apps/app1/public
    app2 -> apps/app2/public

app1并且app2是指向其各自应用程序公共目录的符号链接)。这是此处描述的子 URI 的乘客设置:http ://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rack_to_sub_uri

使用以下配置,我/foo将进入 app2:

server {
  listen 80;
  server_name mydomain.com;
  root /var/www;
  passenger_enabled on;
  passenger_base_uri /app1;
  passenger_base_uri /app2;

  location /foo {              
    rewrite ^.*$ /app2 last;
  }
}

现在,我如何让 app1 接收其他所有内容?我已经尝试了以下(放置在location /foo指令之后),但我得到了一个带有无限内部重定向的 500:

location / {
  rewrite ^(.*)$ /app1$1 last;
}

我希望该last指令能阻止无限重定向,但我想不会。我的/foo重写仍然有效。而且我还可以去http://mydomain.com/app1

有任何想法吗?谢谢!

4

1 回答 1

1

一种方法是创建一个新config.ru文件,将请求分派到正确的应用程序。

# /var/www/apps/config.ru
require './app1/app1'
require './app2/app2'

map ('/') { run App1 }
map ('/foo') { run App2 }

当然,这意味着您的应用程序必须以能够在同一执行空间上运行的方式制作。

于 2011-08-02T12:33:40.710 回答