允许在查看目录时列出文件,但直接访问时受到保护(通过 HTTP 身份验证)

允许在查看目录时列出文件,但直接访问时受到保护(通过 HTTP 身份验证)

.htaccess我使用和创建了一个受密码保护的目录.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 指令后,它们会从目录列表中消失。删除它后,它们会显示出来。我希望至少能够看到目录列表中的文件,但访问这些文件时会提供 auth 提示。

答案1

我正在保护该目录中的 CSV 文件。设置该 auth 指令后,它们会消失。删除它后,它会显示出来。我希望至少能够看到这些文件,但访问这些文件时,它会提供 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

相关内容