有没有一种方法可以配置 Apache Web 服务器以返回 404(未找到)错误代码而不是 403(禁止)对于我想要禁止访问的某些特定目录?
我发现了一些建议使用 mod_rewrite 的解决方案,例如
RewriteEngine On
RewriteRule ^.*$ /404 [L]
由于发送 404 而不是 403 的目的是为了混淆目录结构,所以这种解决方案太暴露了,因为它重定向到某个不同的位置,这使得最初访问的目录显然确实存在。
有没有一种方法可以配置 Apache Web 服务器以返回 404(未找到)错误代码而不是 403(禁止)对于我想要禁止访问的某些特定目录?
我发现了一些建议使用 mod_rewrite 的解决方案,例如
RewriteEngine On
RewriteRule ^.*$ /404 [L]
由于发送 404 而不是 403 的目的是为了混淆目录结构,所以这种解决方案太暴露了,因为它重定向到某个不同的位置,这使得最初访问的目录显然确实存在。
RedirectMatch 404 /\.
成功了,它禁止访问以点开头的所有文件或目录,从而给出“404 Not Found”错误。
来自 Apache 手册:“Redirect[Match] 指令通过要求客户端在新位置重新获取资源来将旧 URL 映射到新 URL。” 默认情况下,Redirect会发送 302 返回码,但也可以返回其他状态码,如上图所示。
你可以做这样的事情:
.htaccess
错误文档 403 /error/404.php
404.php
<?php
$status = $_SERVER['REDIRECT_STATUS'] = 404;
header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $status);
?>
404 Error
在遇到同样的问题后,我最终得到了以下 .htaccess 文件
Options -Indexes
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain.com [NC]
RewriteRule ^(.*)/$ - [R=404,NC]
第 1 行和第 3 行确保您不能列出文件夹内容,如果这样做会收到 404 错误。RewriteCond指令确保此重写规则仅适用于主域。由于我有几个子域,没有 rewritecond,访问 www.mydomain.com/subdomain 也返回 404,这不是我想要的。
在我看来,完成这项任务.htaccess
是非常丑陋的解决方案。
可以在 apache 配置中实现。看一看:
添加到您的 apache 配置中:
ErrorDocument 403 /404
然后重启apache:
service apache2 restart
就这些。
要将所有 403,400 错误更改为 404 错误,请将其放在/etc/apache2/conf.d/localized-error-pages的末尾或放入.htaccess
# Will raise a 404 error, because the file <fake_file_for_apache_404.php> doesn't exist.
# We change 403 or 400 to 404 !
ErrorDocument 400 /fake_file_for_apache_404.php
ErrorDocument 403 /fake_file_for_apache_404.php
# We need to rewrite 404 error, else we will have "fake_file_for_apache_404.php not found"
ErrorDocument 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL <script type=\"text/javascript\">document.write(document.location.pathname);</script> was not found on this server.</p></body></html>"
ErrorDocument 500 "Server in update. Please comme back later."