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

fue*_*zig 26 apache security mod-rewrite http-status-code-403 http-status-code-404

有没有办法如何配置Apache Web服务器为某些特定目录返回404(未找到)错误代码而不是403(禁止),我想禁止访问?

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

RewriteEngine On
RewriteRule ^.*$ /404 [L]
Run Code Online (Sandbox Code Playgroud)

由于发送404而不是403的目的是混淆目录结构,这个解决方案太具有启发性,因为它重定向到某个不同的位置,这使得最初访问的目录显然确实存在.

fue*_*zig 27

RedirectMatch,例如

RedirectMatch 404 ".*\/\..*"
Run Code Online (Sandbox Code Playgroud)

诀窍,它禁止访问以点开头的所有文件或目录,给出"404 Not Found"错误.

从Apache手册:"Redirect [Match]指令通过要求客户端在新位置重新获取资源,将旧URL映射到新URL." 默认情况下,Redirect会发送302返回代码,但它也可以返回其他状态代码,如上所示.

  • +1,但为了匹配网址路径中的任何一个点,我们真的需要引号和点星吗?即,我们不能只做`RedirectMatch 404 /\.`而不是`RedirectMatch 404'.*\/\..*"`? (3认同)

Tom*_*mer 8

你可以做这样的事情:

的.htaccess

ErrorDocument 403 /error/404.php

404.php

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

404 Error
Run Code Online (Sandbox Code Playgroud)

  • *为什么这不足以支持?*我使用了这个解决方案.这非常简单.但是,由于我有PHP> = 5.4.0,我只使用`<?php http_response_code(404); ?>`在`404.php`页面的顶部.这样我就可以使用`ErrorDocument***任何代码***/error/404.php`,它们都会在HTTP头中变成'404`. (2认同)
  • @ADTC,它与问题无关,即如何要求 Apache 执行此操作,而不是 PHP。 (2认同)

jff*_*jff 6

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

Options -Indexes
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain.com [NC]
RewriteRule ^(.*)/$ - [R=404,NC]
Run Code Online (Sandbox Code Playgroud)

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