有没有办法强制 apache 返回 404 而不是 403?

Posted

技术标签:

【中文标题】有没有办法强制 apache 返回 404 而不是 403?【英文标题】:Is there a way to force apache to return 404 instead of 403? 【发布时间】:2010-12-01 23:02:38 【问题描述】:

有没有一种方法可以配置 Apache Web 服务器以针对我希望禁止访问的某些特定目录返回 404(未找到)错误代码而不是 403(禁止)?

我发现了一些建议使用 mod_rewrite 的解决方案,例如

RewriteEngine On
RewriteRule ^.*$ /404 [L]

由于发送 404 而不是 403 的目的是为了混淆目录结构,所以这个解决方案太暴露了,因为它重定向到一些不同的位置,这使得最初访问的目录确实存在。

【问题讨论】:

this question 能解决您的问题吗? 我第一次看到这个问题时没有考虑(太混乱了),但看了第二遍后我找到了我一直在寻找的行,谢谢。 【参考方案1】:

RedirectMatch 例如

RedirectMatch 404 /\.

成功了,它禁止访问以点开头的所有文件或目录,并给出“404 Not Found”错误。

来自 Apache 手册:“Redirect[Match] 指令通过要求客户端在新位置重新获取资源来将旧 URL 映射到新 URL。” Redirect默认发送302返回码,但也可以返回其他状态码如上图。

【讨论】:

+1,但是要匹配 url 路径中任何位置的单个点,我们真的需要引号和点星吗?即,我们不能只做RedirectMatch 404 /\. 而不是RedirectMatch 404 ".*\/\..*" 吗? @fuenfundachtzig 它为“.git/.htaccess”和“.git/.php”返回 403 而不是 404 @Awaaaaarghhh,这可能是因为您的 apache 配置中有一个优先的 FilesMatch 指令。 Tomer 的回答中建议的 403 的自定义 ErrorDocument 也将涵盖这种情况,但需要 php @fuenfundachtzig but requires php,不,为什么是php?! - 您也可以为您的自定义 ErrorDocument 使用静态 html 文档,例如“my404error.html”! that's likely because you have a FilesMatch dir,不,我在没有RedirectMatch 的情况下对其进行了测试。无论如何谢谢你! :) 我能够修复所有问题,现在所有请求都返回 404 错误:***.com/a/61199481/4224741(我使用了FilesMatch)。我进行了很多测试并阅读了 apache 文档,但在特定情况下无法正确使用 RedirectMatch 因为html 无法将 403 更改为 404。【参考方案2】:

你可以做这样的事情:

.htaccess

错误文档 403 /error/404.php

404.php

<?php
$status = $_SERVER['REDIRECT_STATUS'] = 404;
header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $status);
?>

404 Error

【讨论】:

为什么这没有得到足够的支持?我使用了这个解决方案。这很简单。但是,由于我的 PHP >= 5.4.0,我只是在404.php 页面的顶部使用了&lt;?php http_response_code(404); ?&gt;。这样我就可以使用ErrorDocument *** any code *** /error/404.php,它们都会在HTTP头中变成404 如果我想将所有请求发送到唯一的 index.php 前端控制器脚本并让它决定是否应该执行 404.php? @ADTC,这与问题无关,即如何要求 Apache 执行此操作,而不是 PHP。 @ChrisCogdon 如何让 Apache 执行此操作 > 这正是 .htaccess(一个 Apache 可读文件)所做的。所以最后,这个答案仍然是要求 Apache 这样做。 Apache 在出现 403 错误时执行 404.php 文件。 PHP 解析文件并将输出通过 Apache Web 服务器 发送到浏览器。这其中的无关紧要在哪里? @tonix 您只需将所有错误代码重定向到 index.php 并在其中编写 PHP 脚本以执行必要的操作(检查并确定是否为 404,然后包括 404.php 否则包括其他一些内容)。【参考方案3】:

在遇到同样的问题后,我最终得到了以下 .htaccess 文件

Options -Indexes
RewriteCond %HTTP_HOST ^(www\.)?mydomain.com [NC]
RewriteRule ^(.*)/$ - [R=404,NC]

第 1 行和第 3 行确保您不能列出文件夹内容,如果这样做会收到 404 错误。 RewriteCond 指令确保此重写规则仅适用于主域。由于我有几个子域,没有 rewritecond,访问 www.mydomain.com/subdomain 也返回 404,这不是我想要的。

【讨论】:

这对我很有效。只有一个问题是Options -Indexes 的工作方式:/img/(不存在)正确返回了 404,但 /img/(确实存在,我想访问,但不是目录列表)返回 403 . 所以,我所做的是删除 Options -Indexes 并确保正则表达式(指定允许的文件)永远不会只匹配目录名称。 *这不是子域,而是子站点...,可以被 RewriteCond 绕过进行目录检查(... -d ...)...【参考方案4】:

在我看来,在 .htaccess 中完成这项任务是非常丑陋的解决方案。

可以在 apache 配置中实现。看看:

添加到您的 apache 配置中:

ErrorDocument 403 /404

然后重启apache:

service apache2 restart

就是这样。

【讨论】:

那一行是行不通的(不管你把它放在 htaccess 还是 apache config 中)。【参考方案5】:

要将所有 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."

【讨论】:

我在 30 分钟前给了 +1,并且知道我意识到:HTML 返回 404,但 HTTP 状态代码仍然返回“HTTP/1.1 403 Forbidden”(应该是 -1)! 它工作。在***.com/questions/6479198/… 上查看我的编辑

以上是关于有没有办法强制 apache 返回 404 而不是 403?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL

网站日志返回404如何解决

有没有办法强制赛普拉斯在同一个标​​签而不是另一个标签中打开

在 Asp.net Web API 中捕获 404 错误

有没有办法强制 TinyMCE 在使用表格按钮时创建 <div> 表格而不是使用 <table> 标签?

Symfony Route 不工作 Apache 返回 404