避免在 nginx 中使用代理重复密码保护 URL

Avoid duplication in password protect URL with proxy in nginx

我有一个使用 gunicorn 提供的烧瓶应用程序,并在其之上安装了 nginx。我想使用基本身份验证 (user/password) 来保护所有以 /admin 开头的网址,这是后台,但仍然继续使用没有密码的 gunicorn 为所有其他网址提供服务。

这是我当前的 nginx 配置:

server {
    listen 80;
    server_name example.com;
    charset utf-8;

    location / {
        proxy_pass http://localhost:8000;
        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 /admin {
        auth_basic "Administrator Login";
        auth_basic_user_file /home/app/.htpasswd;
        # the following four directives are duplicated :(
        proxy_pass http://localhost:8000;
        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_* 指令,则以 /admin 开头的 URL 不会转发到 gunicorn,我会收到 404。

有什么办法可以避免配置重复?我尝试了位置嵌套,但显然最后 nginx 只有 "executes" 一个位置块。

proxy_pass 必须在位置块内。但是,不需要复制 proxy_set_header 指令,它们可以移到服务器块中。所以你的错误只是假设 proxy_pass 可以存在于服务器块中:-)