我在我的开发网站上使用基本身份验证(例如dev.example.com),我遇到了一个问题,我的网站在初次访问后没有提示我输入凭据。换句话说,如果我清除浏览器缓存,则会出现提示,我可以正常登录。会话持续很好,但在会话到期后我自动注销,我不会再次提示我的凭据。
这也意味着如果我点击'取消',我再也不会被提示了。
刷新无法解决问题,我在初次访问后能够查看网站的唯一方法是每次都使用隐身窗口,或者清除缓存并刷新页面。
该页面显示默认的401 nginx错误页面,响应是实际的401错误。
我已经尝试将auth_basic
线移动到我配置的各个部分,但这似乎没有任何效果。我没有自定义401错误页面所以我没有指定error_page 401
,这可能是个问题吗?
通过在标题上设置www-authenticate
来解决哪个问题,但这是为我定义的。
这可能与配置有关吗?这是我目前的配置:
server {
server_name dev.MYSITE.com;
root /srv/dev/MYSITE/current;
index index.php index.html index.htm;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_pass http://localhost:3010;
proxy_redirect off;
proxy_read_timeout 240s;
# Basic HTTP Auth
auth_basic "MYSITE Dev Site";
auth_basic_user_file /etc/nginx/sites-password/MYSITE.htpasswd;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location ~ /\.ht {
deny all;
}
listen 443 ssl http2; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/dev.MYSITE.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/dev.MYSITE.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = dev.MYSITE.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name dev.MYSITE.com;
return 404; # managed by Certbot
}
注意:我使用nginx作为Node.js服务器的反向代理。
编辑:我不确定为什么这是相关的,但这是一个支持离线模式的Progressive Web App(PWA)。我刚刚注意到,如果我绕过服务工作者的缓存,则提示会正确显示(在开发工具中绕过 - >应用程序 - >服务工作者 - >网络旁路)。
更新:看来我的服务工作者正在缓存401响应并阻止提示。似乎我可能需要以前在错误的地方寻找。
更新2:现在这看起来像是一个“功能”...... https://bugs.chromium.org/p/chromium/issues/detail?id=623464
我建议处理response.status值。如果它不是200(response.ok),那么你可能不想缓存它。
我建议通过某种if / else或switch / case逻辑运行响应,以处理不同的响应状态代码,内容类型,路由等场景。
服务工作者缓存变得复杂,应用程序越复杂:)