25

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

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

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

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

+0

Есть ли [этот вопрос] (http://stackoverflow.com/questions/548156/problem-redirecting-403-forbidden-to-404-not-found) решить вашу проблему? –

+0

Я не рассматривал этот вопрос, когда впервые увидел его (слишком запутанным), но после второго взгляда я нашел линию, которую искал, спасибо. – fuenfundachtzig

ответ

25

RedirectMatch как в примере.

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

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

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

+3

+1, но чтобы соответствовать одной точке в любом месте URL-адреса, действительно ли нам нужны кавычки и точка-звезда? Я не могу просто сделать «RedirectMatch 404/\.» Вместо «RedirectMatch 404». * \/\ .. * "'? – zx81

5

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

.htaccess

ErrorDocument 403 /error/404.php

404.php

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

404 Error 
+2

* Почему это недостаточно для поддержки? * Я использовал это решение. Это очень просто. Однако, поскольку у меня есть PHP> = 5.4.0, я просто использовал ' 'в верхней части страницы' 404.php'. Таким образом, я могу использовать 'ErrorDocument *** любой код ***/error/404.php', и все они станут «404» в заголовке HTTP. – ADTC

+0

Что делать, если я хочу отправить все запросы в уникальный скрипт front-скрипта index.php и решить, нужно ли выполнить 404.php? – tonix

+1

@ADTC, это не относится к вопросу, а именно, как просить Apache сделать это, а не PHP. –

-2

Для того, чтобы изменить все 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." 
+0

Я дал +1 30 минут назад, и знаю, что понимаю: HTML возвращает 404, но код состояния HTTP по-прежнему возвращает «HTTP/1.1 403 Forbidden» (должно быть -1 вместо)! –

+0

Это работает. См. Мое редактирование по адресу http://stackoverflow.com/questions/6479198/denying-via-404-instead-of-403/20642687#20642687 – ImmortalPC

6

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

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

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

+0

Это хорошо работает для меня. Только одна проблема заключается в том, как работает 'Options -Indexes':/img/(который не существует) правильно вернул 404, но/img/(который существует, и я хочу получить доступ, но не список каталогов) 403. Итак, что я сделал, это удалить «Параметры -Indexes» и просто убедиться, что регулярные выражения (которые указывают разрешенные файлы) никогда не совпадают только с именем каталога. –

+0

* Это не субдомен, а подсайт ..., может быть обойден RewriteCond для проверки каталога (... -d ...) ... –