Nginx,将位置块重定向到另一个

Nginx,将位置块重定向到另一个

对于以 /c/ 开头的 uri,我想进行 memcached 密钥测试,并返回密钥的值(如果存在)。如果没有密钥,则应将其传递给代理。

我通过这个指令来做到这一点:

location ^~ /c/ {
    set $memcached_key "prefix:$request_uri";
    memcached_pass 127.0.0.1:11211;

    default_type       application/json;
    error_page 404 405 502 = @proxy
}

对于所有其他请求,我希望它们传递给同一个代理。我使用下面的指令来实现:

location / {
    proxy_pass       http://127.0.0.1:5555;
    proxy_redirect   off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real_IP $remote_addr; 
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}

我的@proxy位置是这样的:

location @proxy {
    proxy_pass       http://127.0.0.1:5555;
    proxy_redirect   off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real_IP $remote_addr; 
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}

如图所示,@proxy与 相同/。我不想复制粘贴我的代理配置。相反,我想将位置重定向/@proxy。如何将一个位置块重定向到另一个位置块?如何摆脱代理的重复配置?

答案1

最简单的做法是将所有常用代理设置放入服务器,然后每个位置都有一个 proxy_pass。您还可以使用上游来避免在多个位置使用地址:端口:

upstream _backend {
    server 127.0.0.1:5555;
}

server {
    proxy_redirect   off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real_IP $remote_addr; 
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass       http://_backend;
    }

    location @proxy {
        proxy_pass       http://_backend;
    }

    location ^~ /c/ {
        set $memcached_key "prefix:$request_uri";
        memcached_pass 127.0.0.1:11211;

        default_type       application/json;
        error_page 404 405 502 = @proxy
    }
}

相关内容