You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:42:36