10

我正在尝试对我的 Nginx 驱动站点上的目录进行密码保护,其中包含 phpMyAdmin、MemcacheMyAdmin 和更多管理实用程序等内容。

该目录位于我网站的根目录中:

domain.com/control/

我服务器上的绝对路径位于:

/home/deployer/sites/domain.com/control/

我使用以下命令在目录中创建了一个 .htpasswd 文件:

htpasswd -c /home/deployer/sites/domain.com/control/.htpasswd admin

该文件存在,由“root”用户拥有,并且是 0644 权限。

在 Nginx 中此域的 .conf 文件中,我使用以下位置块来要求身份验证。

  location /control {
    auth_basic            "Restricted Area: Control";
    auth_basic_user_file  /home/deployer/sites/domain.com/control/.htpasswd;
  }

进入受密码保护的目录时,系统会提示我输入用户名和密码。我输入了我之前创建的凭据,然后我会看到一个错误 403 禁止页面。

访问日志显示我正在点击登录提示,然后以“管理员”用户身份登录:

64.123.456.225 - - [12/May/2013:17:30:48 +0000] "GET /control HTTP/1.1" 401 597 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"
64.123.456.225 - admin [12/May/2013:17:30:48 +0000] "GET /control HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"
64.123.456.225 - admin [12/May/2013:17:30:59 +0000] "GET /control/memcache/ HTTP/1.1" 403 199 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"

错误日志显示以下内容:

2013/05/12 17:31:01 [error] 30462#0: *1 directory index of "/home/deployer/sites/domain.com/control/memcache/" is forbidden, client: 64.123.456.225, server: domain.com, request: "GET /control/memcache/ HTTP/1.1", host: "domain.com"
2013/05/12 17:31:09 [error] 30462#0: *1 directory index of "/home/deployer/sites/domain.com/control/memcache/" is forbidden, client: 64.123.456.225, server: domain.com, request: "GET /control/memcache/ HTTP/1.1", host: "domain.com"

如果我删除该站点的 Nginx .conf 的 Auth 块,我就可以正常访问该页面。

谢谢你的帮助!

4

7 回答 7

14

即使这个问题有其公认的答案,我仍然想在这里提出另一个我遇到问题的案例,这样其他人就不需要像我一样挣扎。

我也得到了具有正确凭据的 403,索引文件不是这种情况,文件存在也不是这种情况,配置是这样的:

auth_basic "some message";
auth_basic_user_file /etc/nginx/.htpasswd;

这里的问题是这/etc/nginx/.htpasswd是一个绝对路径,它实际上指向与nginx.conf. nginx它以某种方式查找文件感到困惑。(以某种方式说,我不完全理解如何nginx不能仅仅处理这个问题,因为很明显路径是绝对的,nginx应该只是阅读它,所以如果有人有更好的解释,请通过评论分享)。

如果我将其更改为:

auth_basic_user_file .htpasswd;

它之所以有效,是因为nginx期望在与nginx.conf.

即使我将其更改为:

auth_basic_user_file /home/user/.htpasswd; #and move the file to /home/user too

它也有效,因为我认为路径没有混淆nginx

于 2015-12-22T03:56:00.990 回答
6

这可能是由权限或不存在或无效的目录索引指令引起的。

权限:如果 www 是 nginx 拥有的,而 /var 是 root 拥有的,那么 www 会继承 var 的权限,从而拒绝访问。

索引指令:如果目录索引设置为不可用的文件,那么 nginx 将抛出 403。在这种情况下,我猜它默认为 index.htm 而不是 index.php。

最好的运气!

于 2013-05-12T18:07:56.667 回答
4

我来到这里是因为我遇到了类似的问题。我已将顶级目录设置为“autoindex on;”。我为子目录添加了密码保护,并为 ("/subdirectory") 单独声明,而无需重复 "autoindex on;" 这让 nginx 寻找一个索引文件,因为没有,我看到“禁止”。

一旦我添加了“autoindex on;” 到“/子目录”的设置。浏览子目录时出现目录列表。

于 2017-02-06T22:30:22.610 回答
1

错误不是身份验证,而是您尝试访问的目录及其内容:

/home/deployer/sites/domain.com/control/memcache/

当网络服务器处理请求时,它会检查已知的索引文件,如 index.html、index.php 等。如果它没有找到其中之一,它会将请求解释为尝试列出给定目录中的所有文件。这似乎在您的 nginx 配置中被禁止(这很好)。信息:

directory index of [...] is forbidden

因此我猜目录

/home/deployer/sites/domain.com/control/memcache/

为空或不包含 nginx 识别的索引文件。
如果您请求特定文件或创建 index.html 文件,则 403-Error 应该会消失。

于 2013-05-12T18:04:40.513 回答
1

如果您在 dockerized 环境中运行 NGINX,将.htpasswd文件放在与 NGINX 配置文件default.conf相同的目录中会有所帮助

例如,假设我的.htpasswd/home/centos/nginx/conf(这也是一个 Docker 卷):

/home/centos/nginx/conf
drwxr-xr-x. 2 centos centos   70 Sep 14 17:39 .
drwxr-xr-x. 3 centos centos   40 Sep 14 17:02 ..
-rw-r--r--. 1 centos centos 1409 Sep 14 17:39 default.conf
-rw-r--r--. 1 root   root     44 Sep 14 16:52 .htpasswd

请记住,您必须在 NGINX 容器中指明位置,而不是在您的主机中。

就我而言,容器中配置文件的位置是:

   /etc/nginx/conf.d

这是一个与我的主机目录匹配的卷

   /home/centos/nginx/conf

因此,您应该在 default.conf 文件中指定的位置如下,这是 NGINX 看到的:

   location / {
       auth_basic  "Administrato's area";
       auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
于 2020-09-14T18:04:44.567 回答
0

我已经使用 .htpasswd HERE在 nginx 上描述了“如何设置身份验证”解决方案的步骤

请检查上面给出的链接,如果它以某种方式对某人有所帮助,我会很高兴,因为我努力使这件事发挥作用。

谢谢。

于 2016-02-12T09:24:23.880 回答
0

看起来nginx密码必须加密。尝试:

sudo sh -c "echo -n 'someuser' >> /etc/nginx/.htpasswd"

接着:

sudo sh -c "openssl passwd somepassword >> /etc/nginx/.htpasswd"

请记住,.htpasswd 文件应该与 nginx 文件夹相关。

在这里找到的解决方案,现在对我有用。

编辑:伪代码中的一些修正

于 2022-01-07T16:06:34.980 回答