nginx设置密码限制路径访问

nginx设置密码限制路径访问

很多时候我们希望nginx代理的时候可以限制某些路径只能够我们自己访问,而不是全部开放给别人,所以就可以通过nginx自带的auth_basic来设置
除了auth_basic,nginx还支持其他第三方的认证插件,本文仅使用auth_basic

生成密码文件

首先需要生成密码文件,网上有不少教程是使用htpasswd,但因为我使用的是centOS,自带了openssl,所以用openssl来生成密码文件,htpasswd类似

cd /xx/nginx/conf.d
echo -n "username:" >> passwd
openssl passwd 123456 >> passwd

生成完毕后,就可以配置nginx了

配置nginx

我希望路径带private的全部需要密码访问,不管是http://www.xxx.com/a/b/private/c.html还是http://www.xxx.com/private通通拦住,所以location直接配置为private,有其他匹配要求的可以参考nginx正则表达式的匹配规则

server {
    listen 80;
    server_name www.xxx.com;
    client_max_body_size 1024m;

    location ~ private {
        #autoindex on;
        #autoindex_exact_size off;
        #autoindex_localtime on;
        auth_basic "Please input password";    # 引号内容为输入密码的提示,可自行修改
        auth_basic_user_file conf.d/passwd;    # 这里的路径是刚刚生成的密码文件的位置
        proxy_pass http://xxx.xxx.xx:8080;
    }
    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://xxx.xxx.xx:8080;
    }

可以看到,这三个被我注释掉了,如果需要让nginx代理的是文件,那么可以打开这三个,用浏览器访问的时候将呈现出一个目录的形式

        #autoindex on;
        #autoindex_exact_size off;
        #autoindex_localtime on;

本例是让nginx代理转发到另一个服务,所以就全部注释掉了,如果输入密码正确才允许访问带private路径的资源
下面的location /代表全部放过,所以这个配置就实现了,只有路径带private需要密码访问,其余放过

效果

在这里插入图片描述
其中要注意的是,密码输入正确之后,浏览器之后的请求都会带上认证信息一段时间,也就是说验证成功后带private的路径都可以直接访问,不需要每次都输入密码(失效时间暂不清楚=。=经测试大概一天左右才需要重新输入密码)

一开始不知道,测试的时候老是以为怎么这auth_basic配置了无效?重启了很多次nginx还是可以直接访问限制的路径,后来才发现,只要passwd文件没改动,浏览器就会一直帮我带上认证信息=。=所以测试的时候可以使用多个浏览器,或者修改passwd文件来进行=。=