nginx auth_basic“Restricted”提示登录每个请求

时间:2015-09-11 17:21:38

标签: http authentication nginx

我已经设置了一个简单的nginx服务器,将位置块配置为指向我想要服务的相应目录,并使用auth_basic模块设置基本身份验证。

但是, 我的服务器在位置块 下的每个页面请求上请求用户名:密码凭据,即使多次向位置块下的不同页面提供这些凭据,包括根位置目录。

如何配置它来存储身份验证?这是nginx问题还是浏览器/请求标头问题?

这是nginx配置:

server {
    listen 80;
    server_name 0.0.0.0;

    location /path/to/dir {
        alias /var/www/dir/;
        index   index.html index.htm;
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        try_files $uri $uri/ =404;
    }
}

在Ubuntu上运行nginx 1.4.6。

2 个答案:

答案 0 :(得分:6)

我的问题是,在页面加载时由JavaScript调用的API调用之一返回401.这似乎重置了页面的浏览器身份验证状态。

答案 1 :(得分:4)

HTTP身份验证信息存储在浏览器缓存中,只有在身份验证失败或来自其他域(auth_basic "Restricted"; 受限制)时才应再次请求。

您的配置很好,考虑到您的密码是正确的,并且Nginx用户具有对密码文件的读取权限(在这种情况下它总是会失败 - 但在日志文件中发送错误消息指示此错误)。这是最可能的原因,主要是如果您只有一个位置具有身份验证。

另一个可能的原因是有多个auth_basic指令,并且它们使用不同的域或密码。对于应用程序生成的WWW-Authenticate标头,这是相同的(例如,如果您的后端应用程序除了Nginx之外还请求HTTP身份验证)。当有不同的域或密码失败时,您的浏览器将再次请求它。我不知道每个URL存储身份验证的浏览器,它始终是realm + hostname的组合。

如果您确实需要在不同位置使用不同的域或密码,请确保它们不会在单个页面上重叠(例如,如果您为资产使用不同的密码:图像,样式或javascript)。或者使用不同的主机 - 但是每个主机/领域组合都会请求一次密码。

<强>更新

0.0.0.0用作server_name - listen 80;已使您的服务器监听所有接口/ IP地址,这是不寻常的。

如果您要使用任何请求主机,请使用server_name _;