nginx目录访问密码保护 有时候需求这样:某个域名,或域名下的某个目录,需要访问时输入指定的用户名和密码。nginx同样可以做到,而且一点不比apache差。
第一步:生成htpasswd文件
htpasswd是Apache密码生成工具,Nginx支持auth_basic认证,因此我们也可以将生成的密码用于Nginx中,输入一行命令即可安装:
apt install httpd-tools
参数如下:
-c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容.
-n 不更新passwordfile,直接显示密码
-m 使用MD5加密(默认)
-d 使用CRYPT加密(默认)
-p 使用普通文本格式的密码
-s 使用SHA加密
-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互
-D 删除指定的用户
htpasswd -bsc /etc/nginx/.htpasswd hxs 123456
第二步:在nginx的配置文件nginx.conf中添加
location ^~ /wp-admin/ {
auth_basic "Restricted Access";
auth_basic_user_file /home/user/domains/.htpasswd;
}
需要注意的是如果不用^~ /wp-admin/
而用 /wp-admin/的话,那么将只能对目录进行验证 直接访问其下的文件 将不会弹出登录验证
第三步:发现新的问题
但是,然后你会发现,直接访问里面的 php 文件会变成下载而不是运行——超囧~
度娘上有提到解决方法—gzip需要关闭,因为会把动态文件解析成静态
我是这样解决的:在刚才的 location ^~ /ooxx/{ … } 里面加多一段对 php 的配置,变成
location ^~ /wp/wp-admin/ {
auth_basic "Authorized users only";
auth_basic_user_file /etc/nginx/.htpasswd;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
}
上述是nginx-php7.4的配置,nginx-php7.0的配置如下
location ^~ /wp-admin/ {
auth_basic "Restricted Access Area";
auth_basic_user_file /home/user/domains/.htpasswd;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}