【问题标题】:403 forbidden - Nginx - using correct credentials403 禁止 - Nginx - 使用正确的凭据
【发布时间】:2013-05-06 19:08:35
【问题描述】:

我正在尝试对我的 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 块,我就可以正常访问该页面。

感谢您的帮助!

【问题讨论】:

  • 这里有很多很好的答案,这是一个老问题,但只是添加一件事-值得禁用授权并检查您是否没有收到 403 错误。我只是花了很长时间才发现我解决了错误的问题。

标签: nginx http-status-code-403 .htpasswd


【解决方案1】:

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

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

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

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

如果我将其更改为:

auth_basic_user_file .htpasswd;

因为nginx 期望在与nginx.conf 相同的目录中找到该文件。

即使我把它改成:

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

这也有效,因为我认为路径不会混淆nginx

【讨论】:

  • 是的,我认为这应该是正确的答案。这是唯一对我有帮助的答案。
【解决方案2】:

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

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

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

祝你好运!

【讨论】:

  • 这是正确的。我添加了“索引 index.php;”到位置块并加载。非常感谢。
  • 要搭载 jgpatrick3 的另一个答案,如果您尝试使用自动索引,索引也可能是一个问题,因为身份验证会覆盖外部指令中的 autoindex on - 所以您必须“手动”在认证区域重新启用autoindex on
  • 我遇到了与 OP 类似的问题,我刚刚在我正在设置的新站点上实施了 403 身份验证。好吧,事实证明这是一个权限问题,而不是所有者问题。我正在使用 Laravel,并且已将网站根设置为 /var/www/domain.com 而不是 /var/www/domain.com/public (然后在修复根文件夹后我不得不 chmod storage/logsstorage/framework)。现在一切都好!希望这对某人有所帮助。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    /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 应该会消失。

    【讨论】:

      【解决方案5】:

      如果您在 dockerized 环境中运行 NGINX,将 .htpasswd 文件与 NGINX 配置文件 default.conf

      例如,假设我在 /home/centos/nginx/conf 中有我的 .htpasswd(这也是一个 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;
      

      【讨论】:

        【解决方案6】:

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

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

        谢谢。

        【讨论】:

          【解决方案7】:

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

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

          然后:

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

          记住,.htpasswd 文件应该是相对于 nginx 文件夹的。

          找到解决方案here,现在对我有用。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-24
            • 2018-12-17
            • 2019-06-07
            • 2019-04-17
            • 2019-05-29
            • 1970-01-01
            • 2019-01-28
            相关资源
            最近更新 更多