nginx - 为什么我不能使用 proxy_pass 路径中的变量?

nginx - 为什么我不能使用 proxy_pass 路径中的变量?

为什么我不能在 proxy_pass 中使用变量 $user - 如下例所示?

server {
    listen 80;
    server_name ~^(?P<user>[a-z|A-Z|0-9|_|-]+)\.example\.net$;
    root /home/$user/webapps/;

    location /app/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://unix:/home/$user/webapps/app/run/gunicorn.sock:/;
    }
}

这有可能实现吗?还是我应该放弃?

这个虽然完美,但是也不起作用。

server {
    listen 80;
    server_name ~^(?P<user>[a-z|A-Z|0-9|_|-]+)\.example\.net$;
    root /home/$user/webapps/;

    location ~ ^\/(?P<app>[\w-_]+)(\/.*)?$ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://unix:/home/$user/webapps/$app/run/gunicorn.sock:/;
    }
}

我读这里但它们都没有通过unix套接字覆盖proxy_pass。

答案1

代理传递指令不会将 $user 和 $app 视为参数,在这种情况下,您必须通过$is_args$args变量告诉他,如下所示:

proxy_pass http://unix:/home/$user$is_args$args/webapps/$app$is_args$args/run/gunicorn.sock:/;

答案2

发现问题出在 'uri' 而不是变量上,因此正确的配置应该是

proxy_pass http://unix:/home/$user/webapps/$app/run/gunicorn.sock:$request_uri;

我应该更快地开启调试,谢谢你的支持。

我无法再检查这个解决方案,这是我现在的猜测 - 因为我每个应用程序使用一个配置,所以我将尝试稍后统一我的配置。

相关内容