我希望mydomain.com/
,mydomain.com/a
,mydomain.com/b
和mydomain.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支持不是邪恶的;)
答案 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
| |
| -----<---------|