记一次使用nginx auth_basic做权限控制的坑


一、前言

在生产配置中,客户不想让其他的用户直接看到通过域名访问后的首页,但又想用户可以通过域名访问下面的一个下载页面,于是博主想到了使用nginx的auth_basic来控制权限。

二、实战

1.解决location优先级问题

贴上当时的nginx配置:

server{
        listen 443 ssl;
        server_name www.xxx.top;
        ssl_certificate /www/cert/xxx.pem;
        ssl_certificate_key /www/cert/xxx.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        location / {
            root /wwwroot/web;
            index index.html index.htm;
            auth_basic "Please input name and password";    # 开启登录验证
            auth_basic_user_file /www/data/passwd;
        }
        location = /down {
            root /opt/test;
            index index.html;
            auth_basic off;    # off表示此页面不做登录验证
            allow all;
            access_log /www/wwwlogs/down.log;
        }
}

本以为是配置是没有问题的,谁知访问还是需要输入账号和密码,仔细排查才发现是匹配优先级的问题,在文末附上location匹配规则。

2.解决root问题

修改后的配置

        location ^~ /down {
                root /opt/test;
                index index.html;
                auth_basic off;
                allow all;
                access_log /www/wwwlogs/down.log;
        }

接下来访问出现404,仔细排查才发现,博主在指定/down 链接时指定的目录使用的是root而不是alias,在文末介绍root和alias的区别。

3.成功实现

修改后的配置:

        location ^~ /down {
            alias /opt/test;
            index index.html;
            auth_basic off;    # off表示此页面不做登录验证
            allow all;
            access_log /www/wwwlogs/down.log;
        }

最后终于成功访问,通过这次问题博主发现自己的基础知识很不扎实,只能乖乖的去学习。

三、location 匹配规则

    ~ 波浪线表示执行一个正则匹配,区分大小写
    ~* 表示执行一个正则匹配,不区分大小写
    ^~ 表示普通字符匹配,使用前缀匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
    = 进行普通字符精确匹配,也就是精确匹配
    !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
    / 通用匹配,任何请求都会匹配到

四、关于alias和root的区别:

root和alias是系统文件路径的设置。
root用来设置根目录,而alias用来重置当前文件的目录。

location /img/ {
    alias /var/www/image/;
}

若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件

location /img/ {
    root /var/www/image;
}

若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。

如有错误,欢迎随时指正。

参考文章1
参考文章2


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM