一、前言
在生產配置中,客戶不想讓其他的用戶直接看到通過域名訪問后的首頁,但又想用戶可以通過域名訪問下面的一個下載頁面,於是博主想到了使用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/目錄下找文件。
如有錯誤,歡迎隨時指正。