为网站中的某些页面要求密码的最佳方法

best method to require passwords for some pages in a web site

我有一个网站,其中大多数 material 公开可用,但大约 10% 应该受密码保护。该站点是在 Debian 系统上使用 NGINX 发布的。

使用密码(或某种其他形式的身份验证)保护少数目录和单个页面的最佳方法是什么?

我认为 NGINX 允许我保护一些目录,但这看起来很粗糙,我不确定在站点配置中订购和列出所有要保护的目录是否是个好主意。

我显然不是 NGINX 配置方面的专家,因此我怀疑是否有更好的方法?

我已经尝试使用给出的建议,但没有成功。我现在有:

map $uri $realm {
        /Reserved       "Username and Password required";
        default                 off;
}

server {
    server_name a.b.c;

    root /var/www/html/homepage;

    auth_basic $realm;
    auth_basic_user_file /etc/nginx/.htpasswd;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        location /homepage {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

     access_log /var/log/nginx/heiden.log;
...
}

当 URI 为 a.b.c/Reserved/index.htmlReserved/* 中的所有其他文件都应受到保护时,映射中必须包含哪些内容?我试过 a.b.c/Reserved/* 但它没有触发密码请求(或者是 firefox 保存的密码在跟我开玩笑?)。

除了您需要保护的 URI 列表,我看不到任何其他方法。下面是使用基本身份验证和带有要保护的 URI 列表的 map 块来保护它们的示例:

map $uri $realm {
    /uri/to/protect/1    "Protected area";
    /uri/to/protect/2    "Protected area";
    ...
    default              off;
}
server {
    ...
    auth_basic $realm;
    auth_basic_user_file /path/to/.htpasswd;
    ...
}

您还可以使用 ~(用于 case-sensitive 匹配)或 ~*(用于 case-insensitive 匹配)字符串前缀,如果您的列表可以以某种方式简化的话。例如,要保护以 /path/to/protected/area 开头的每个 URI,您可以使用以下 map 块:

map $uri $realm {
    # every URI starting with the following prefix will require basic authorization
    ~^/path/to/protected/area  "Protected area";
    ...
}