Есть ли способ, чтобы заставить Апач вернуть 404, а не 403?
Можно ли настроить веб-сервер Apache так, чтобы он возвращал код ошибки 404 (не найден) вместо 403 (запрещен) для некоторых конкретных каталогов, доступ к которым я хочу запретить?
Я нашел несколько решений, предлагающих использовать mod_rewrite, например
RewriteEngine On
RewriteRule ^.*$ /404 [L]
Поскольку цель отправки 404 вместо 403 состоит в том, чтобы запутать структуру каталогов, это решение слишком показательно, потому что оно перенаправляет в какое-то другое место, что делает очевидным, что каталог, к которому первоначально обращались, действительно существует.
4 ответа:
RedirectMatch как, например,
RedirectMatch 404 ".*\/\..*"
Делает трюк, он запрещает доступ ко всем файлам или каталогам, начинающимся с точки, давая ошибку" 404 Not Found".
Из руководства Apache: "директива Redirect[Match] преобразует старый URL-адрес в новый, запрашивая у клиента повторную выборку ресурса в новом местоположении."По умолчанию Redirect отправляет код возврата 302, но он также может возвращать другие коды состояния, как показано выше.
После того, как у меня возникла та же проблема, я закончил следующим .htaccess file
Options -Indexes RewriteCond %{HTTP_HOST} ^(www\.)?mydomain.com [NC] RewriteRule ^(.*)/$ - [R=404,NC]
1-я и 3-я строки гарантируют, что вы не можете перечислить содержимое папки, и если вы сделаете это, вы получите ошибку 404. Директива RewriteCond гарантирует, что это правило перезаписи применяется только к главному домену. Так как у меня есть несколько поддоменов, без перезаписи, доступ www.mydomain.com/subdomain кроме того, возвращался 404-й, что было совсем не то, что я предполагал.
Вы можете сделать что-то вроде этого:
.htaccess
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 или в .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."