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

Le *_*ein 2 nginx

我想mydomain.com/,mydomain.com/a,mydomain.com/bmydomain.com/c代理到127.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
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)