記一次使用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