我想mydomain.com/,mydomain.com/a,mydomain.com/b和mydomain.com/c代理到127.0.0.1:8001/site/*和一切的mydomain.com到127.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
Run Code Online (Sandbox Code Playgroud)
第二种情况是"通配符",因此任何不会转到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
Run Code Online (Sandbox Code Playgroud)
所以在伪代码中:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试过的所有内容都会导致nginx崩溃并执行一个位置的重写并获取最后一个位置的proxy_pass URL.
除此之外:很明显,难以弄清楚如何做一些微不足道的事情证明了为什么正确的if/else支持不会是邪恶的;)
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
因为在服务器块中没有写入重写指令,所以Nginx在位置阶段开始匹配url.如果is被一个位置捕获(这里使用第一个位置),则进入重写循环.重写结束时"break"意味着跳出重写循环.然后开始处理这个位置的其他指令,这里将处理proxy_pass.
这种情况下的一般过程是:
location match --> rewrite loop --> proxy_pass
| |
| -----<---------|
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2958 次 |
| 最近记录: |