Nginx:除索引页面外的密码保护文件夹

时间:2019-08-28 12:05:34

标签: authentication nginx basic-authentication nginx-location nginx-config

我的站点中的文件夹受密码保护。它包含一个子站点:example.com/subsite。我只想公开(删除密码保护)子站点主页,以便任何人都可以浏览到example.com/subsite并获取/subsite/index.html,但是文件夹中的任何其他页面仍需要凭据。

身份验证已经有效:

location /subsite {
  auth_basic "Subsite users only.";
  auth_basic_user_file /etc/nginx/subsite-pwds;
}

我可以公开主页,该主页需要其他一些资源才能工作。

# public access to home page only
location = /subsite/index.html {
    auth_basic off;
}
location /subsite/assets {
    auth_basic off;
}
location /subsite/img {
    auth_basic off;
}
location /subsite/scripts {
    auth_basic off;
}
location /subsite/stylesheets {
    auth_basic off;
}

这允许任何人获取example.com/subsite/index.html。但是我想要的是任何人都可以获取example.com/subsite

以上第一个位置块的以下替代方法均无效。所有人都会向example.com/subsite

发出密码挑战
# 1
location = /subsite {
    auth_basic off;
}
# 2
location = /subsite/ {
    auth_basic off;
}
# 3
location = /subsite {
    auth_basic off;
    rewrite ^ /subsite/index.html last;
}
# 4
location ~ ^/subsite$ {
    auth_basic off;
}

1 个答案:

答案 0 :(得分:1)

基于Nginx的默认行为,URI /subsite(解析为目录)从外部重定向到/subsite/

索引模块将URI /subsite/内部重定向到/subsite/index.html

这些URI /subsite/subsite//subsite/index.html中的每一个都是分别处理的,如果Nginx选择了您的location /subsite { ... }块,它们中的任何一个都可以触发身份验证检查处理单个URI。

要绕过索引页的身份验证检查,除了问题中标识的资源URI外,您还需要一个或多个与三个URI匹配的位置。

例如:

location = /subsite {
    auth_basic off;
}
location = /subsite/ {
    auth_basic off;
}
location = /subsite/index.html {
    auth_basic off;
}
location /subsite/assets {
    auth_basic off;
}
location /subsite/img {
    auth_basic off;
}
location /subsite/scripts {
    auth_basic off;
}
location /subsite/stylesheets {
    auth_basic off;
}