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

Nginx: password protect folder except index page

我站点中的一个文件夹受密码保护。它包含一个子站点: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

None 上面第一个位置块的以下替代方案有效。都对 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;
}

基于 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;
}