Nginx 对某个位置中除一个子路由之外的所有子路由进行身份验证

Nginx 对某个位置中除一个子路由之外的所有子路由进行身份验证

免责声明:我不太熟悉 nginx

我的服务器内部有这个位置块:

location /appname/ {
      proxy_pass http://127.0.0.1:11399/;
      proxy_set_header Host $host;
      proxy_set_header X-Real_IP $remote_addr;
}

我想在除 之外的每个页面上设置基本身份验证/appname/。因此,如果路径是,/appname/则只需将其传递给 11399 端口上的 docker 容器。但如果路径是其他任何内容(^/appname/.+),则先请求身份验证。

重要!我无法编辑外部服务器块,因为它包含其他位置的大量其他应用程序,而我需要将其仅应用于此位置块。

我尝试过这个:

location = /appname/ {
    proxy_pass http://127.0.0.1:11399/;
    proxy_set_header Host $host;
    proxy_set_header X-Real_IP $remote_addr;
}
location ~ ^/appname/(.+)$ {
    auth_basic "Hello hiiii";
    auth_basic_user_file /path/to/.htpasswd;
    proxy_pass http://127.0.0.1:11399/$1;
    proxy_set_header Host $host;
    proxy_set_header X-Real_IP $remote_addr;
}

对我来说,如果路径是,/appname/则转到location = /appname/块。如果不是,则转到正则表达式块。但是当我访问时,myhost.com/appname/出于某种原因,系统会提示我输入身份验证表单。这没有意义,在任何情况下都无法/appname/匹配^/appname/.+正则表达式。看起来 nginx 的幕后有些我不知道的事情。

如果有人能建议我使用一个嵌套位置块来实现这一点,我将不胜感激。我不喜欢上一个示例有重复的行。我尝试了类似这样的方法

location /appname/ {
    auth_basic "Hello hiiii";
    auth_basic_user_file /path/to/.htpasswd;
    proxy_pass http://127.0.0.1:11399/;
    proxy_set_header Host $host;
    proxy_set_header X-Real_IP $remote_addr;
    location = /appname/ {
        auth_basic off;
    }
}

还有很多变体,但都不起作用。大多数情况下,访问时都会出现 404/appname/

答案1

你可以看看nginx 身份验证基本文档!尝试使用“auth_basic off;”和“allow all”。我怀疑可能还存在其他问题。

尝试这个:

location /appname/ {
    proxy_pass http://127.0.0.1:11399/;
    proxy_set_header Host $host;
    proxy_set_header X-Real_IP $remote_addr;
    allow all;
    auth_basic off;
}

相关内容