2

我希望mydomain.com/,mydomain.com/a和被代理到mydomain.com/b,其他一切都到.mydomain.com/c127.0.0.1:8001/site/*mydomain.com127.0.0.1:8002

这些 URL 都在完全相同的域上,不涉及子域。我不想使用子域,这不是一个选项。URL 都在同一个域中。

第一种情况还涉及重写以将内容发送到子文件夹。所以:

http://mydomain.com/ -> http://127.0.0.1:8001/site/
http://mydomain.com/a -> http://127.0.0.1:8001/site/a
http://mydomain.com/b -> http://127.0.0.1:8001/site/b
http://mydomain.com/c -> http://127.0.0.1:8001/site/c

第二种情况是“通配符”,所以任何不去 127.0.0.1:8001/site/* 的东西都应该去 127.0.0.1:8002。所以:

http://mydomain.com/monkey -> http://127.0.0.1:8002/monkey
http://mydomain.com/banana -> http://127.0.0.1:8002/banana
http://mydomain.com/x -> http://127.0.0.1:8002/x

所以在伪代码中:

if domain is 'mysite.com'
  if path in ['/', '/a', '/b', '/c']
    proxy to 127.0.0.1:8001 + '/site' + path
  else
    proxy to 127.0.0.1:8002 + path

到目前为止,我所做的一切都导致 nginx 失败并进行了一个位置的重写并获取了最后一个位置的 proxy_pass URL。

旁白:显然,很难弄清楚如何做这件微不足道的事情,这证明了为什么正确的 if/else 支持不会是邪恶的;)

4

1 回答 1

5

您可以参考 nginx 手册中的“rewrite”和“proxy_pass”指令,这很容易解决:

location ~* "^/$|^/(a|b|c).*?$" {
    rewrite "^/(.*)$" /site/$1 break;
    proxy_pass http://127.0.0.1:8001;
    ......; // to add any commands you need
    break;
}

location / {
    proxy_pass http://127.0.0.1:8002;
    ......; // to add any commands you need
    break;
}

由于 server 块中没有写入 rewrite 指令,Nginx 在定位阶段开始匹配 url。如果 is 被一个位置捕获(这里以第一个位置为例),则进入重写循环。重写结束时的“break”表示跳出重写循环。然后开始处理这个位置的其他指令,这里会处理proxy_pass。

在这种情况下,一般流程是:

location match --> rewrite loop --> proxy_pass
      |                |
      | -----<---------|
于 2013-08-01T04:11:00.530 回答