Есть ли способ заставить apache вернуть 404 вместо 403?

есть ли способ, как я могу настроить веб-сервер Apache для возврата кода ошибки 404 (не найден) вместо 403 (запрещено) для некоторых конкретных каталогов, к которым я хочу запретить доступ?

Я нашел некоторые решения, предлагающие использовать mod_rewrite, например

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

поскольку цель отправки 404 вместо 403-запутать структуру каталогов, это решение слишком показательно, потому что оно перенаправляет в другое место, что делает его очевидно, что каталог, к которому первоначально обращались, действительно существует.

4 ответов


RedirectMatch как, например,

RedirectMatch 404 ".*\/\..*"

делает трюк, он запрещает доступ ко всем файлам или каталогам, начинающимся с точки, давая ошибку "404 не найден".

из руководства Apache: "директива Redirect[Match] сопоставляет старый URL-адрес с новым, попросив клиента восстановить ресурс в новом месте."По умолчанию редирект отправляет код возврата 302, но он также может возвращать другие коды состояния, как показано выше.


после того, как у меня была та же проблема, я закончил со следующим .htaccess файл

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

1-я и 3-я строки убедитесь, что вы не можете перечислить содержимое папки, и если вы это сделаете, вы получите ошибку 404. The RewriteCond директива гарантирует, что это правило перезаписи применяется только к основному домену. Поскольку у меня есть несколько поддоменов, без перезаписи, доступ www.mydomain.com/subdomain также возвращался 404, что не было тем, что я намеревался.


вы можете сделать что-то вроде этого:

.реврайт

ErrorDocument 403 / error / 404.в PHP

404.в PHP

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

404 Error

изменить все 403,400 ошибки в ошибки 404, положить это в конце / etc/apache2 / conf.D / localized-error-pages или .реврайт

# 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."