403 禁止 - Nginx - 使用正确的凭据

Posted

技术标签:

【中文标题】403 禁止 - Nginx - 使用正确的凭据【英文标题】:403 forbidden - Nginx - using correct credentials 【发布时间】: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 错误。我只是花了很长时间才发现我解决了错误的问题。 【参考方案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,现在对我有用。

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

【讨论】:

以上是关于403 禁止 - Nginx - 使用正确的凭据的主要内容,如果未能解决你的问题,请参考以下文章

403 - 禁止访问: 访问被拒绝。您无权使用所提供的凭据查看此目录或页面。 怎么解决 ?

Grails Spring Security REST得到403禁止

Cors 阻止 Nginx 上状态为 403 的请求

如何解决谷歌分析 api 调用中的 403 错误

在 Oauth2 安全(客户端凭据)资源服务器应用程序中为 WebFluxTest 获取 403 禁止

Nginx 403 禁止使用 pimcore