我正在尝试密码保护我的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块,我就可以正常访问该页面了。
感谢您的帮助!
答案 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)
答案 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;