有没有办法强制 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
页面的顶部使用了<?php http_response_code(404); ?>
。这样我就可以使用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
有没有办法强制赛普拉斯在同一个标签而不是另一个标签中打开