为什么我不能在 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:/;
}
}
答案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;
我应该更快地开启调试,谢谢你的支持。
我无法再检查这个解决方案,这是我现在的猜测 - 因为我每个应用程序使用一个配置,所以我将尝试稍后统一我的配置。