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

时间:2013-05-12 17:52:13

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

我正在尝试密码保护我的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禁止页面。

访问日志显示我正在访问登录提示,然后以“admin”用户身份登录:

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块,我就可以正常访问该页面了。

感谢您的帮助!

6 个答案:

答案 0 :(得分:8)

即使这个问题有其可接受的答案,我仍然想提出另一个我在这里遇到麻烦的案例,以便其他人不需要像我一样挣扎。

我的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

答案 1 :(得分:4)

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

权限: 如果www由nginx拥有但/ var由root拥有,则www将继承var的权限,从而拒绝访问。

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

最好的透明度!

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我已经使用.htpasswd HERE

描述了nginx上“如何设置身份验证”解决方案的步骤

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

感谢。

答案 5 :(得分:0)

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

例如,假设我在 / home / centos / nginx / conf (也是Docker卷)中有我的 .htpasswd

/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;