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

Pla*_*ard 8 nginx http-status-code-403 .htpasswd

我正在尝试密码保护我的Nginx支持的网站上的目录,其中包含phpMyAdmin,MemcacheMyAdmin和更多管理实用程序.

此目录位于我的站点的根目录中:

domain.com/control/
Run Code Online (Sandbox Code Playgroud)

我服务器上的绝对路径是:

/home/deployer/sites/domain.com/control/
Run Code Online (Sandbox Code Playgroud)

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

htpasswd -c /home/deployer/sites/domain.com/control/.htpasswd admin
Run Code Online (Sandbox Code Playgroud)

该文件存在,由"root"用户拥有,并且是0644权限.

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

  location /control {
    auth_basic            "Restricted Area: Control";
    auth_basic_user_file  /home/deployer/sites/domain.com/control/.htpasswd;
  }
Run Code Online (Sandbox Code Playgroud)

当进入受密码保护的目录时,系统会提示我输入用户名和密码.我输入我之前创建的凭据,然后我会看到错误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"
Run Code Online (Sandbox Code Playgroud)

错误日志显示以下内容:

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"
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

vut*_*ran 11

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

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

auth_basic "some message";
auth_basic_user_file /etc/nginx/.htpasswd;
Run Code Online (Sandbox Code Playgroud)

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

如果我将其更改为:

auth_basic_user_file .htpasswd;
Run Code Online (Sandbox Code Playgroud)

它工作,因为nginx预期在同一目录中找到该文件nginx.conf.

即使我将其更改为:

auth_basic_user_file /home/user/.htpasswd; #and move the file to /home/user too
Run Code Online (Sandbox Code Playgroud)

它也起作用,因为我认为这条路并没有混淆nginx.


小智 5

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

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

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

最好的运气!