如何将域上的一些URL的nginx代理服务器放到一个位置,其余的放在其他位置

时间:2013-07-31 10:49:25

标签: nginx

我希望mydomain.com/mydomain.com/amydomain.com/bmydomain.com/c代理127.0.0.1:8001/site/*其他所有 {{ 1}}到mydomain.com

这些网址都在完全相同的域中,不涉及子域。 我不想使用子域,而且这里不是一个选项。这些网址都在同一个域中。

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

127.0.0.1:8002

第二种情况是“通配符”,所以任何不会转到127.0.0.1:8001/site/*的内容都应该转到127.0.0.1:8002。所以:

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

所以在伪代码中:

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

到目前为止,我所尝试过的所有内容都会导致nginx崩溃并执行一个位置的重写并获取最后一个位置的proxy_pass URL。

除此之外:很明显,难以弄清楚如何做一些微不足道的事情证明了为什么正确的if / else支持是邪恶的;)

1 个答案:

答案 0 :(得分: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;
}

因为在服务器块中没有写入重写指令,所以Nginx在位置阶段开始匹配url。如果is被一个位置捕获(这里使用第一个位置),则进入重写循环。重写结束时“break”意味着跳出重写循环。然后开始处理这个位置的其他指令,这里将处理proxy_pass。

在这种情况下的一般过程是:

location match --> rewrite loop --> proxy_pass
      |                |
      | -----<---------|