一、前言
在生产配置中,客户不想让其他的用户直接看到通过域名访问后的首页,但又想用户可以通过域名访问下面的一个下载页面,于是博主想到了使用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/目录下找文件。
如有错误,欢迎随时指正。