有时候为了安全,希望可以在访问wordpress、typecho等博客网站后台地址的时候,增加一道认证,要先输入用户名和密码,这时候可以使用nginx的basic认证。
利用apache所带的密码生成工具htpasswd
/usr/bin/htpasswd -c /usr/local/nginx/conf/vhost/domain.com.pass user
或
/usr/bin/htpasswd -nb user passwd
然后将生成的内容复制到domain.com.pass。
以下的配置可以保护admin目录下的所有文件。如果你只设了/admin/,那么直接输入/admin/index.php还是可以访问的。
location ~ ^/admin/.* {
include enable-php.conf;
auth_basic "auth";
auth_basic_user_file /usr/local/nginx/conf/vhost/domain.com.pass;
}
或
location ~ /admin(/.*) {
include enable-php.conf;
auth_basic "auth";
auth_basic_user_file /usr/local/nginx/conf/vhost/domain.com.pass;
}
有两个注意事项。第一个是匹配后台admin路径的location要放到include enable-php.conf;
的前面,如果放到后面了,由于enable-php.conf里有php正则匹配,类似/admin/login.php这种以php为后缀的url会优先走location ~ php
而不是优先走location ~ admin
,这样就不会进行basic认证了。第二个是location ~ admin
里面要添加include enable-php.conf
,因为类似/admin/login.php这种url进行basic认证后也是要通过fastcgi方式跑php的,如果不加include enable-php.conf
就会直接当作文件下载了。
以下的写法不行,basic认证通过后访问后台网页会直接下载。
location ^~ /admin/ {
auth_basic "auth";
auth_basic_user_file /usr/local/nginx/conf/vhost/domain.com.pass;
}
注意wordpress的/wp-admin和/wp-login.php都需要保护。
除了某个文件以外,其他内容都启用HTTP基本验证的例子:
location = /test {
auth_basic off;
allow all;
}
博主你好,按照你的教程,在nginx.conf下添加的代码如下:
location ~ ^/box/.* {
auth_basic "Auth Login";
auth_basic_user_file /usr/local/nginx/conf/vhost/auth/admin.pass;
}
我没有添加include enable-php.conf;这句,测试,访问https://domain/box时,会弹出输入框,但是我直接加上index.php的话,就不需要输入账户密码了。
随后又把第一句改成
location ~ /box(/.*) {
测试,依然跟上面的情况一样。
不知道我是出错在哪里?
与代码所在位置的先后顺序有关,要把你的location代码放到include enable-php.conf的前面,如果放后面了,就会优先匹配enable-php.conf里的location ~ [^/]\.php(/|$)而不是匹配你的location代码。