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/logs
和 storage/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禁止