.htaccess配置:目录无末尾斜杠时返回404而非301
解决现有目录不带斜杠访问返回301重定向的问题
问题说明
我希望通过返回404状态码隐藏不希望访客访问的现有文件和目录,目前已实现以下效果:
- example.net/file.txt 返回404 ✔
- example.net/dir/ 返回404 ✔
- example.net/dir/anyFileIHaveHere.txt 返回404 ✔
但访问example.net/dir时返回301状态码,并重定向至example.net/dir/,这会暴露目录存在性。为规避浏览器缓存,我用curl测试:
curl -H 'Cache-Control: no-cache, no-store' -X GET -v 'https://example.net/dir'
尝试过多种方法均未生效:
- ErrorDocument 301 /pages/404.php
- RewriteRule "/dir" "/pages/404.php"
- DirectorySlash Off
- 用FilesMatch匹配dir并设置deny from all
- 用Location匹配dir并设置deny from all
我的主机是Hostinger,求可行的解决方法。
当前.htaccess配置
根目录下的.htaccess
ErrorDocument 403 /pages/404.php ErrorDocument 404 /pages/404.php <FilesMatch "file1|file2|fileN"> order Allow, Deny deny from all </FilesMatch>
/dir目录下的.htaccess
Deny from all
可行解决方案
修改根目录的.htaccess配置,结合关闭目录自动补斜杠和重写规则,直接拦截不带斜杠的目录请求返回404:
ErrorDocument 403 /pages/404.php ErrorDocument 404 /pages/404.php # 关闭Apache自动补目录斜杠的默认行为 DirectorySlash Off # 启用重写引擎 RewriteEngine On # 精确匹配不带斜杠的dir请求,返回404状态码 RewriteRule ^dir$ - [R=404,L] <FilesMatch "file1|file2|fileN"> order Allow, Deny deny from all </FilesMatch>
规则说明
DirectorySlash Off:阻止Apache自动将/dir重定向到/dir/,从根源避免301跳转RewriteRule ^dir$ - [R=404,L]:精确匹配路径为/dir的请求,直接返回404;L标记表示处理完这条规则后停止后续规则解析
如果有多个需要隐藏的目录,可扩展规则批量处理:
RewriteRule ^(dir|secret-dir|private-dir)$ - [R=404,L]
调整后,访问/dir和/dir/都会返回404,彻底避免目录存在性被猜测。
内容的提问来源于stack exchange,提问作者Dani Feldman
相关产品推荐
相关产品推荐

