Linux

允許在查看目錄時列出文件,但在直接訪問時受保護(通過 HTTP 身份驗證)

  • July 11, 2021

.htaccess我使用and創建了一個受密碼保護的目錄.htpasswd,但是當我轉到目錄 URL 時,這些文件沒有顯示出來。

我有這個.htaccess

#Protect multiple files
<FilesMatch "^(.*).csv$">
AuthName "Dialog prompt"                                                                                                                                                                                       
AuthType Basic
AuthUserFile /xxxxx/test                                                                                                                                              
#AuthUserFile ".htpasswd"                                                                                                                                                                                      
Require valid-user                                                                                                                                                                                             
</FilesMatch>       

目錄列表 - 不顯示 CSV 文件

**更新:**我正在保護該目錄中的 CSV 文件。當設置了 auth 指令時,它們會從目錄列表中消失。當我刪除它時,它們會出現。我希望至少能夠看到目錄列表中的文件,但是在訪問這些文件時,它會提供身份驗證提示。

我正在保護該目錄中的 CSV 文件。當設置了 auth 指令時,它們就會消失。當我刪除它時它會顯示出來。我希望至少能夠看到這些文件,但是在訪問這些文件時,它會提供一個身份驗證提示。

當使用 mod_autoindex 生成目錄列表時,會為目錄列表中出現的每個文件發出一個內部子請求。當使用<FilesMatch "^(.*).csv$">容器時,它也正在為這些子請求處理,因此目錄列表中這些文件的條目也被阻止。

使用該<FilesMatch>指令的另一種方法是使用<If>表達式並針對THE_REQUEST伺服器變數進行測試。只有當使用者實際請求文件而不是瀏覽目錄列表時,這才會成功。.csv

例如:

# Directory listings (mod_autoindex) need to be enabled
Options +Indexes

# Protect CSV files from being accessed, but still visible in directory listing
<If "%{THE_REQUEST} =~ m#\.csv(\s|\?)#">
AuthName "Dialog prompt"                                                                                                                                                                                       
AuthType Basic
AuthUserFile /xxxxx/test                                                                                                                                              
Require valid-user                                                                                                                                                                                             
</If>

THE_REQUEST包含 HTTP 請求的第一行。例如。GET /foo/test.csv HTTP/1.1(在 GET 請求的情況下/foo/test.csv) - 並且在整個請求過程中不會改變。因此,當請求目錄本身時,例如。/foo/然後不處理封閉的塊,並且不阻止這些文件的列表。

增加的複雜性是THE_REQUEST包含請求的整個 URL,其中可能包括查詢字元串。因此,檢查(\s|\?)(即空格文字?)是為了避免通過簡單地包含查詢字元串來繞過密碼檢查。例如。/foo/test.csv?anything.

引用自:https://serverfault.com/questions/1066903