nginx条件代理传递

时间:2011-10-24 15:51:04

标签: proxy nginx

我正在尝试配置nginx代理将请求传递给另一台服务器, 仅当$ request_body变量与特定正则表达式匹配时。

我现在的问题是,我不知道如何准确配置此行为。

我目前正在讨论这个问题:

server {
    listen 80 default;
    server_name test.local;

    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_host;

            if ($request_body ~* ^(.*)\.test) {
                    proxy_pass http://www.google.de;
            }

            root /srv/http;
    }

}

但问题在于,root始终是高手。 代理不会以任何方式传递。

关于如何实现这一目标的任何想法?

提前致谢

2 个答案:

答案 0 :(得分:14)

试试这个:

server {
    listen 80 default;
    server_name test.local;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;

        if ($request_body ~* ^(.*)\.test) {
            proxy_pass http://www.google.de;
            break;
        }

        root /srv/http;
    }

}

答案 1 :(得分:0)

Nginx路由基于与请求URI匹配的location指令。解决方案是临时修改此设置,以便将请求转发到不同的端点。

server {
    listen 80 default;
    server_name test.local;

     if ($request_body ~* ^(.*)\.test) {
         rewrite ^(.*)$ /istest/$1;
     }

     location / {
         root /srv/http;
     }

     location /istest/ {
        rewrite ^/istest/(.*)$  $1 break;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://www.google.de;

    }
}

if条件只能在Nginx中与它的一部分rewrite module一起安全使用。在这个例子中。 rewrite在请求URI的前面加上istest

location块优先于最接近的匹配。匹配/istest/的所有内容都将转到第二个块,该块使用另一个rewrite从请求URI中删除/istest/,然后转发到上游代理。