我有一个 nginx 服务器块,用于代理传递来自三个服务器的内容:gitlab、Rshiny 和来自另一个 nginx 服务器块的静态内容。所有这些都运行正常,直到我尝试为静态内容站点中的一个目录添加密码保护。我有以下配置:
代理的位置块:
location /project_builds/ {
rewrite ^/project_builds/(.*)$ /$1 break;
proxy_pass http://localhost:8000;
proxy_redirect http://localhost:8000/ $scheme://$host/project_builds/;
}
静态页面的服务器块:
server {
listen 8000;
server_name localhost;
location / {
root /web/project_builds/;
index index.html;
autoindex on;
}
location /campy_SAM {
auth_basic "Restricted content";
auth_basic_user_file /web/password_files/campy_SAM/.htpasswd;
}
}
此配置的结果是,静态站点的根材料可以正常显示在代理位置,并且静态页面的子目录会按预期要求输入用户名和密码。但是,当我提供正确的用户名和密码时,我得到的是“404 Not Found”页面。当我注释掉配置中的两行“auth_basic”时,子目录中的内容可以正常显示。
我是否在代理的位置块中缺少某些内容以使密码验证正常工作?
来自服务器的日志:
error.log(密码错误)
2014/06/27 16:55:23 [错误] 30504#0:*64 用户“campy_SAM”:密码不匹配,客户端:127.0.0.1,服务器:localhost,请求:“GET /campy_SAM/project_page.html HTTP/1.0”,主机:“localhost:8000”,引荐来源:“http://********************/project_builds/”
error.log(正确密码)
2014/06/27 16:55:56 [错误] 30504#0:*67 open()“/usr/share/nginx/html/campy_SAM/project_page.html”失败(2:没有此文件或目录),客户端:127.0.0.1,服务器:localhost,请求:“GET /campy_SAM/project_page.html HTTP/1.0”,主机:“localhost:8000”,引荐来源:“http://*****************/project_builds/”
答案1
我根据发布 nginx 日志的建议解决了这个问题。我想仔细检查日志总是一个好主意。我犯了一个错误,将根目录放在服务器的第一个位置块内。因此,当我导航到子目录时,它映射了错误的位置。以下配置使它按我期望的方式工作:
server {
listen 8000;
server_name localhost;
root /web/project_builds/;
location / {
index index.html;
autoindex on;
}
location /campy_SAM {
auth_basic "Restricted content";
auth_basic_user_file /web/password_files/campy_SAM/.htpasswd;
}
}
仍然令人好奇的是,当我删除身份验证时,它起作用了,并且根位于第一个位置块内......我可能无法理解为什么会这样:)